Это для экспериментального проекта 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
от него или какой-нибудь быстрый способ найти его записи.