Я имею дело с распаковкой zip-файла, загруженного с помощью Retrofit. Я анализирую поток байтов напрямую, не сохраняя файл .zip в памяти, поэтому для распаковки файла у меня нет .zip (так что я не могу создать класс ZipFile и выполнить итерации по нему).
Вот мой код:
private void writeResponseBodyToDisk(ResponseBody body) {
try {
ZipInputStream zipInputStream = null;
OutputStream outputStream = null;
ZipEntry entry;
try {
byte[] fileReader = new byte[4096];
zipInputStream = new ZipInputStream(body.byteStream());
while ((entry = zipInputStream.getNextEntry()) != null) {
try {
if (!entry.getName().contains("__MACOSX")) {
String outFilePath = filePath + entry.getName();
outputStream = new FileOutputStream(outFilePath);
int len;
while ((len = zipInputStream.read(fileReader)) > 0) {
outputStream.write(fileReader, 0, len);
}
}
} catch (IOException e) {
LogUtils.logException(e, TAG);
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
} catch (IOException e) {
LogUtils.logException(e, TAG);
cancel(true);
} finally {
if (zipInputStream != null) {
zipInputStream.close();
}
}
} catch (IOException e) {
LogUtils.logException(e, TAG);
cancel(true);
}
}
Когда я читаю первую запись, все параметры неизвестны (размер, csize, cr c, ...), затем, когда я звоню getNextEntry()
он будет вызван closeEntry()
для текущей записи, и это вызовет исключение «IOException: pu sh обратный буфер заполнен». Я добавил inte rnet, что я не единственный с этой проблемой, но я не могу понять, как решить эту проблему без использования ZipFile.
(Более того, это исключение происходит только с одним файлом .zip , это не повреждено, хотя, потому что я могу открыть его с помощью 7zip или других инструментов)
Надеюсь, я был достаточно ясен, Спасибо:)