Получить InputStream из ZipEntry из ZipInputStream из DocumentFile - PullRequest
0 голосов
/ 23 февраля 2019

Это для экспериментального проекта Android, выполненного на Java.Мне нужно прочитать ZIP-файл с внешней карты (как можно быстрее, если это возможно) и возвращать InputStream, соответствующий записи, каждый раз, когда это требуется OSMDroid пользовательским провайдером плиток.

Я могу сделать это довольно легко, когда обслуживаю ZIP с основного (или как он там называется в их поврежденной файловой системе) диска, но при попытке чтения с внешней карты единственный вариант в более новых версиях Android - этоиспользуйте их блестящие SAF .

Когда путь не относительный, а URI к внешней карте, я использую DocumentFile для получения ZIP 101 * (очевидно,, единственный способ сделать это).

DocumentFile file = DocumentFile.fromSingleUri(this, uri);
ContentResolver contentResolver = getContentResolver();
InputStream inStream = contentResolver.openInputStream(file.getUri());

Вопрос 1 : Что было бы удивительно в этот момент, когда использование DocumentFile уже сказалось на производительности из-за того, как медленнееэто значит, что доброе старое File должно иметь возможность преобразовать inStream в ZipFile.Или как-то напрямую получить ZipFile от DocumentFile.Это возможно?Может быть, получить File от DocumentFile, затем ZipFile от этого?

Я не нашел никакого решения, поэтому я продолжил с InputStream, который я преобразовал в ZipInputStream.Проблема в моем коде заключается в том, что я могу запустить его только один раз, когда мне нужно делать это каждый раз, когда нужен поток файла из Zip.

public class MyZipFileArchive implements IArchiveFile {
    protected static ZipInputStream mZipInputStream;
}

public void init(InputStream inStream) {
    mZipInputStream = new ZipInputStream(inStream);
}

public InputStream getInputStream(ITileSource pTileSource, long pMapTileIndex) {
    final String path = pTileSource.getTileRelativeFilenameString(pMapTileIndex);
    ZipEntry entry = null;
    while ((entry = mZipInputStream.getNextEntry()) != null) {
        if (path.equals(entry.getName())) {
            return mZipInputStream;
        }
    }
    return null;
}

Вопрос 2 : При первом вызове getInputStream возвращается то, что он находит, но теперь поток заканчивается, а во второй раз возвращается null.

Итак, мне нужен способ сбросить поток, если возможно, каждый раз при вызове функции, или использовать другой подход.Я попытался сохранить каждый ZipEntry в List в начале, а затем перебрать его.Не работаетКроме того, я не нашел способа конвертировать ZipEntry в InputStream, который необходимо вернуть.

Как бы вы справились с этим?По сути, мне нужно использовать DocumentFile, и мне нужно получить ZipFile от него или какой-нибудь быстрый способ найти его записи.

...