Как разархивировать файл, заархивированный PKZIP, на мейнфрейме с помощью Java?

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

  1. #P2# #P3# <блочная цитата> #P4#
  2. #P5# #P6# <блочная цитата> #P7#
  3. #P8# #P9# <блочная цитата> #P10#

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


person Vincent    schedule 12.11.2016    source источник
comment
Если даже rar или 7zip не могут открыть файл, вы должны предположить, что файл действительно поврежден.   -  person Heri    schedule 12.11.2016
comment
Где выполняется ваш код Java (мэйнфрейм или другой)? Какие были параметры zip, когда файл был создан на мейнфрейме? Есть ли проблемы с кодовой страницей? Являются ли первые два байта x'504B' (т.е. PK в ASCII)?   -  person cschneid    schedule 12.11.2016
comment
Если вы не получите его с мэйнфрейма в виде бинарного файла, вы его испортите. Ваш контент в EBCDIC?   -  person Bill Woodger    schedule 12.11.2016
comment
Если вы загрузили файл на локальный компьютер с помощью FTP, убедитесь на 100%, что вы выполнили двоичную передачу. Текст выполнит преобразование кода из EBCDIC в ISO-8859, что создаст все виды хаоса. Кроме того, любой текст EBCDIC внутри сжатых файлов будет EBCDIC, поэтому преобразование должно где-то происходить.   -  person zarchasmpgmr    schedule 13.11.2016
comment
Кажется, zip-файл действительно поврежден из-за того, что он не был передан в двоичном формате, теперь проблема решена, спасибо всем.   -  person Vincent    schedule 15.11.2016


Ответы (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 байта верны, если файл был усечен во время передачи, это также может вызвать сообщение о повреждении файла.

person randomScott    schedule 13.11.2016
comment
Привет randomScott, ты прав. Я обнаружил, что результат команды xxd: 0000000: 262e 039c 9d00 0000 9700 e96f 7ca8 6a0d &..........o|.j. 0000010: bea5 9801 0000 8709 0000 1800 6d00 3c99 ............м.‹. , который не запускается из PK..-.....,f.H.^. Поэтому я думаю, что файл действительно поврежден, так как не передается в двоичном виде с MainFrame на мой Linux-сервер. - person Vincent; 15.11.2016
comment
@radomScott Это хорошие данные. 0000000: 504b 0304 1400 0600 0800 adb0 9a4e 5306 PK...........NS. 0000010: ee08 0108 1a2e 1fff fbda 1c00 0000 4943 ..............IC - person loneStar; 15.05.2019