2016-11-12 71 views
1

我正试图用Java编写一个程序来解压缩由大型机中的PKZIP工具压缩的文件。不过,我尝试了3种以下的方法,但他们都不能解决我的问题。如何解压缩由大型机中的PKZIP压缩文件由Java?

  1. 通过exe。

    我试图用WinRAR,7Zip和Linux命令(unzip)打开它。 所有的失败,以下错误消息:

    The archive is either in unknown format or damaged

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

    我也试图通过JDK的API来将它解压缩,如所描述this website。 然而,失败,错误消息:

    IO Error: 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 lib或Linux命令可以提取由PKZIP在大型机拉链zip文件?非常感谢!

+1

如果甚至rar或7zip都无法打开文件,则必须假定该文件确实已损坏。 – Heri

+0

你的Java代码在哪里执行(大型机或其他)?在大型机上创建文件时,什么是zip选项?是否有代码页问题?是前两个字节x'504B'(即“ASCII”中的“PK”)? – cschneid

+1

如果你没有把它作为一个“二进制”文件关闭,你会腌坏它。您的EBCDIC内容是? –

回答

3

我已成功读取在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文件格式仅仅是一个压缩文件,因此,“罐子”命令也可以读取这些文件。

像其他人一样,我怀疑这个文件可能没有以二进制方式传输,因此被破坏了。在Linux上,你可以使用XXD实用程序(通过管道输送头)转储前几个字节,看看它看起来像一个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个字节是正确的,如果文件在传输期间被截断也可能导致损坏的文件消息。

+0

嗨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服务器。 – Vincent