2013-10-28 35 views
3

當我在寫條目到一個zip文件是這樣的:java:Zip異常無效代碼長度?

ZipEntry ze = zin.getNextEntry(); 
while (ze != null) { 
InputStream is = zf.getInputStream(ze); 
zos.putNextEntry(ze); 
int len; 
while ((len = is.read(buffer)) >= 0) { 
    zos.write(buffer, 0, len); 
} 

zos.closeEntry(); 
ze = zin.getNextEntry(); 

} 

我上第二以下異常while循環:

java.util.zip.ZipException: invalid code lengths set 

at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) 

at java.io.FilterInputStream.read(FilterInputStream.java:107) 

任何人知道爲什麼這個異常被拋出的,什麼是它的意思是?

P.S.我應該提到,我在JBoss 7.1.1上的一個監聽器上運行這個命令,以便壓縮來自不同文件夾的各種日誌文件。每個文件夾都有一個線程。使用多個線程的事實會導致這個問題嗎?

回答

3

您正在將新zip文件的ZipEntry設置爲與原始文件相同的實例。這意味着所有值都必須匹配,但是如果寫入的條目的壓縮大小與源文件的壓縮大小不匹配,則這會失敗。原始壓縮代碼和您現在使用的壓縮代碼之間最小的差異將產生不同的壓縮大小。要使其運行,必須爲輸出創建一個ZipEntry的副本,並重新設置它的壓縮大小。

順便說一句,你在你的代碼,這意味着你使用的是ZipFileZipInputStream同時使用zin.getNextEntry()zf.getInputStream(ze)。如果它們引用同一個文件,那麼這會浪費資源,如果它們涉及不同的文件,則可能會遇到更多問題。

決定要麼ZipFile

ZipFile zf = … 
ZipOutputStream zos = … 
byte[] buffer = … 

for(Enumeration<? extends ZipEntry> e=zf.entries(); e.hasMoreElements();) { 
    ZipEntry ze = e.nextElement(); 
    InputStream is = zf.getInputStream(ze); 
    ZipEntry zeOut=new ZipEntry(ze); 
    zeOut.setCompressedSize(-1); 
    zos.putNextEntry(zeOut); 
    int len; 
    while ((len = is.read(buffer)) >= 0) { 
    zos.write(buffer, 0, len); 
    } 
    zos.closeEntry(); 
} 
zos.close(); 
zf.close(); 

ZipInputStream

ZipInputStream zin… 
ZipOutputStream zos=… 
byte[] buffer = … 

ZipEntry ze = zin.getNextEntry(); 
while (ze != null) { 
    ZipEntry zeOut=new ZipEntry(ze); 
    zeOut.setCompressedSize(-1); 
    zos.putNextEntry(zeOut); 
    int len; 
    while ((len = zin.read(buffer)) >= 0) { 
    zos.write(buffer, 0, len); 
    } 
    zos.closeEntry(); 
    ze = zin.getNextEntry(); 
} 
zos.close(); 
zin.close(); 
+0

感謝的人,這工作就像一個魅力! 我認爲沒有必要「重置」壓縮大小,因爲我只是將文件複製到一個新的zip文件,以便能夠將新文件添加到zip。 P.S.如果你想知道我選擇了ZipInputStream的方式。 – GoAlves