【问题标题】:How to unzip file zipped by PKZIP in mainframe by Java?如何通过Java在大型机中解压缩PKZIP压缩的文件?
【发布时间】:2016-11-12 13:23:43
【问题描述】:

我正在尝试用 Java 编写一个程序来解压缩由 Mainframe 中的 PKZIP 工具压缩的文件。但是,我尝试了以下 3 种方法,它们都不能解决我的问题。

  1. 通过 exe。

    我尝试通过 WinRAR、7Zip 和 Linux 命令(解压缩)打开它。 全部失败并显示以下错误消息:

    存档格式未知或已损坏

  2. 通过 JDK API - java.util.ZipFile

    我也尝试过通过 JDK API 解压缩它,如this website 所述。 但是,它失败并显示错误消息:

    IO 错误:java.util.zip.ZipException:打开 zip 文件时出错

  3. 通过 Zip4J

    我也尝试过使用 Zip4J。它也失败了,有错误消息:

    原因:java.io.IOException: Negative seek offset 在 java.io.RandomAccessFile.seek(本机方法) 在 net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117) ... 5 更多

请问有没有java lib或者linux命令可以在Mainframe中解压PKZIP压缩的zip文件?非常感谢!

【问题讨论】:

  • 如果 rar 和 7zip 都不能打开文件,你必须假设文件确实损坏了。
  • 您的 Java 代码在哪里执行(大型机或其他)?在大型机上创建文件时的 zip 选项是什么?是否存在代码页问题?前两个字节是 x'504B'(即“ASCII”中的“PK”)吗?
  • 如果你不把它作为“二进制”文件从大型机中取出,你会把它腌制得不好。您的内容是否在 EBCDIC 中?
  • 如果您使用 FTP 将文件下载到本地计算机,请确保 100% 确保您进行了二进制传输。文本将进行从 EBCDIC 到 ISO-8859 的代码转换,这将造成各种类型的混乱。此外,压缩文件中的任何 EBCDIC 文本都将是 EBCDIC,因此必须在某处进行转换。
  • 看来zip文件确实是因为不是二进制传输而损坏了,现在已经解决了,谢谢大家。

标签: java zip unzip mainframe pkzip


【解决方案1】:

我已成功读取在 z/OS 上使用 PKZip 压缩并传输到 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 实用程序(通过 head 管道传输)转储前几个字节以查看它是否看起来像一个 zip 文件:

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

前 4 个字节应如图所示。另见the Wikipedia entry for zip files

即使前 4 个字节是正确的,如果文件在传输过程中被截断,也可能导致文件损坏消息。

【讨论】:

  • 嗨 randomScott,你是对的。我发现 xxd 命令的结果是:“0000000: 262e 039c 9d00 0000 9700 e96f 7ca8 6a0d &........o|.j. 0000010: bea5 9801 0000 8709 0000 1800 6d00 3c99 .. ....m.
  • @radomScott 这是一个很好的数据。 0000000:504b 0304 1400 0600 0800 adb0 9a4e 5306 PK............NS。 0000010: ee08 0108 1a2e 1fff fbda 1c00 0000 4943 ....IC
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多