Как распаковать файл, упакованный PKZIP в мэйнфрейм на Java?

Я пытаюсь написать программу на Java, чтобы разархивировать файлы, заархивированные с помощью инструмента PKZIP в мейнфрейме. Тем не менее, я попробовал ниже 3 способов, ни один из них не может решить мою проблему.

  1. От exe.

    Я пытался открыть его с помощью команд WinRAR, 7Zip и Linux (unzip). Все не удалось с ниже сообщение об ошибке:

    Архив находится в неизвестном формате или поврежден

  2. По JDK API - java.util.ZipFile

    Я также попытался разархивировать его с помощью API JDK, как описано на этом сайте. Тем не менее, это не с сообщением об ошибке:

    Ошибка ввода-вывода: java.util.zip.ZipException: ошибка при открытии zip-файла

  3. По Zip4J

    Я также пытался использовать Zip4J. Это тоже не удалось, с сообщением об ошибке:

    Вызывается: java.io.IOException: отрицательное смещение поиска в java.io.RandomAccessFile.seek(собственный метод) в net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117) ... еще 5

Могу ли я спросить, может ли какая-либо команда java lib или linux извлечь zip-файл, заархивированный PKZIP в мейнфрейме? Большое спасибо!

1 ответ

Решение

Я успешно прочитал файлы, которые были сжаты с помощью PKZip в z/OS и перенесены в Linux. Я смог прочитать их с помощью классов java.util.zip*:

        ZipFile ifile = new ZipFile(inFileName);
        // faster to loop through entries than open the zip file as a stream
        Enumeration<? extends ZipEntry> entries = ifile.entries();  

        while ( entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();
            if (!entry.isDirectory()) {  // skip directories
                String entryName = entry.getName();
                // code to determine to process omitted
                InputStream zis = ifile.getInputStream(entry); 
                // process the stream
            }
        }

Формат файла jar - это просто zip-файл, поэтому команда "jar" также может читать такие файлы.

Как и другие, я подозреваю, что, возможно, файл не был передан в двоичном формате и поэтому был поврежден. В Linux вы можете использовать утилиту xxd (пропущенную через голову), чтобы вывести первые несколько байтов, чтобы увидеть, выглядит ли он как файл zip:

# xxd myfile.zip | head
0000000: 504b 0304 2d00 0000 0800 2c66 a348 eb5e  PK..-.....,f.H.^

Первые 4 байта должны быть такими, как показано. Смотрите также запись в Википедии для zip-файлов.

Даже если первые 4 байта верны, если файл был обрезан во время передачи, это также может привести к повреждению файла сообщения.

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