如何在主机上使用Java解压由PKZIP压缩的文件?

3
我正在尝试用Java编写程序来解压由Mainframe PKZIP工具压缩的文件。然而,我已经尝试了以下三种方法,但都不能解决我的问题。
1. 通过exe文件。 我已经尝试使用WinRAR、7Zip和Linux命令(unzip)来打开它。所有这些方法都无法成功,出现以下错误信息: “归档文件格式未知或已损坏。”
2. 通过JDK API - java.util.ZipFile。 我还尝试过使用JDK API 解压缩,就像这个网站所描述的那样。然而,它出现了以下错误信息: “I/O错误:java.util.zip.ZipException: error in opening zip file”
3. 通过Zip4J。 我也尝试过使用Zip4J,但也失败了,并出现以下错误信息: “Caused by: java.io.IOException: Negative seek offset at java.io.RandomAccessFile.seek(Native Method) at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117) ... 5 more”
请问是否有任何Java库或Linux命令可以提取由Mainframe PKZIP压缩的zip文件?非常感谢!

2
如果甚至RAR和7zip也无法打开文件,你必须假设该文件确实已损坏。 - Heri
你的Java代码在哪里执行(主机或其他设备)?当文件在主机上创建时,zip选项是什么?是否存在代码页问题?前两个字节是否为x'504B'(即“ASCII中的”PK“)? - cschneid
3
如果你不将它作为一个“二进制”文件从主机上取下来,它会被损坏。你的内容是以EBCDIC编码吗? - Bill Woodger
2
如果您使用FTP将文件下载到本地机器,请确保进行了二进制传输。文本将执行从EBCDIC到ISO-8859的代码转换,这将创建各种混乱。此外,压缩文件中的任何EBCDIC文本都将是EBCDIC格式,因此必须在某处进行转换。 - zarchasmpgmr
似乎压缩文件确实损坏了,因为没有以二进制方式传输,现在问题已经解决了,谢谢大家。 - Vincent
1个回答

4

我已成功读取了在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个字节应该如图所示。另请参见zip文件的维基百科页面

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


嗨,randomScott,你是对的。我发现xxd命令的结果是: “0000000: 262e 039c 9d00 0000 9700 e96f 7ca8 6a0d & ........... o | .j. 0000010:bea5 9801 0000 8709 0000 1800 6d00 3c99 ............ m. <。“ 这不是以“PK..-.....,f.H.^”开头的。 所以我认为文件确实已损坏,因为没有以二进制方式从MainFrame传输到我的Linux服务器。 - Vincent
@radomScott 这是好的数据吗?0000000: 504b 0304 1400 0600 0800 adb0 9a4e 5306 PK...........NS. 0000010: ee08 0108 1a2e 1fff fbda 1c00 0000 4943 ..............IC - loneStar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接