Невозможно извлечь архив zip64 с помощью ZipInputStream с Java7 и Java8

Я использую приведенный ниже код для извлечения файлов из zip-архива.

public static List<String> unzipFiles(File zipFile, File targetDirectory) {
    List<String> files = new ArrayList<String>();
    BufferedOutputStream dest = null;
    FileInputStream fileInputStream = null;
    ZipInputStream zipInputStream = null;
    try {
        fileInputStream = new FileInputStream(zipFile);
        zipInputStream = new ZipInputStream(new BufferedInputStream(
                fileInputStream));
        ZipEntry zipEntry;
        int count = 0;
        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
            log.debug("Extracting File Name :: " + zipEntry);
            count++;
            int length;
            byte data[] = new byte[bufferGlb];
            String fileName = zipEntry.getName();
            File opFile = new File(targetDirectory, fileName);
            FileOutputStream fileOutputStream = new FileOutputStream(opFile);
            dest = new BufferedOutputStream(fileOutputStream, bufferGlb);
            while ((length = zipInputStream.read(data, 0, bufferGlb)) != -1) {
                dest.write(data, 0, length);
            }
            dest.flush();
            files.add(fileName);
            fileOutputStream.close();
        }
        log.debug("Total " + count + " Files Unziped Successfully ");
    } catch (Exception e) {
        log.error("Error occured in unzipping the file " + zipFile, e);
    }
}

Этот код отлично работает с обычными zip-архивами, но не с архивом zip64. Насколько я знаю, Java7/Java8 (класс ZipInputStream) должен поддерживать zip64, но я получаю следующее исключение.

java.util.zip.ZipException: invalid entry size (expected 0 but got 21504 bytes)
at java.util.zip.ZipInputStream.readEnd(ZipInputStream.java:384)
at java.util.zip.ZipInputStream.read(ZipInputStream.java:196)

Однако я могу извлекать файлы из zip64 с помощью общего сжатия ZipArchiveInputStream.

Любая идея, почему этого нельзя добиться с помощью Java API (ZipInputStream).

С этим вопросом сталкивается множество людей, но у нас нет правильного ответа. Пожалуйста помоги

DockYard 19.02.2019 13:17

Вы не на MacOS, не так ли? Потому что это должно быть возможно на других платформах и более новых установках MacOS.

Joop Eggen 19.02.2019 13:25

Да как не на MacOS, его windows10

ragi 21.02.2019 05:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
514
0

Другие вопросы по теме