Неизвестный размер ZipEntry вызывает сбой zipInputStream.getNextEntry - PullRequest
0 голосов
/ 27 апреля 2020

Я имею дело с распаковкой 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 или других инструментов)

Надеюсь, я был достаточно ясен, Спасибо:)

...