2016-11-12 66 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