Не удается распаковать zip-файл, созданный с помощью zlib в Java - PullRequest
2 голосов
/ 22 октября 2019

Я пытаюсь использовать zlib в Java (java.util.zip) для архивирования файла, но не могу разархивировать файл после его создания. Я использую код ниже:

    public static ByteArrayInputStream compress(InputStream inputStream, String targetFilePath) {

        String fileName = new File(targetFilePath).getName();

        try {

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
            zipOutputStream.putNextEntry(new ZipEntry(fileName));
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

            byte[] buffer = new byte[1000];
            int len;
            while ((len = bufferedInputStream.read(buffer)) > 0) {
                zipOutputStream.write(buffer, 0, len);
            }
            bufferedInputStream.close();
            zipOutputStream.closeEntry();
            return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

        } catch (IOException ex) {
            log.error("The file does not exist");
        }
        return null;
    }

Когда я читаю файл sample.txt и вводю его как InputStream для этого метода, он создает файл sample.zip.

Однако, когда я пытаюсь открыть этот zip-файл с помощью команды unzip, он не открывается с ошибкой ниже:

  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of sample.zip or
        sample.zip.zip, and cannot find sample.zip.ZIP, period.

Я пытался открыть zip-файл с помощью jar xvf sample.zip, который работал и показал, что он содержитsample.txt текстовый файл. Это работает, потому что команда jar не ищет End-of-central-directory signature в zip-файле.

Может ли кто-нибудь пролить свет на то, почему эта подпись отсутствует в zip-файле? Любая помощь в этом отношении высоко ценится.

1 Ответ

1 голос
/ 22 октября 2019

Обязательно закройте ZipOutputStream после того, как вы написали последнюю запись. Это дает потоку возможность завершить создание архива ZIP.

...