2012-11-01 63 views
0

我試圖從一個ZIP壓縮文件中讀取一個XML文件。相關代碼如下:Java ZipInputStream不能讀取整個ZipEntry

ZipInputStream zis = new ZipInputStream(is); 
ZipEntry entry = zis.getNextEntry(); 
while(entry != null) { 
    if(entry.getName().equals("plugin.xml")) { 
     int size = (int)entry.getSize(); 
     byte[] bytes = new byte[size]; 
     int read = zis.read(bytes, 0, size); 

     System.out.println("File size: " + size); 
     System.out.println("Bytes read: " + read); 
    } 
} 

此,工作時產生的輸出如下:

File size: 5224 
Bytes read: 5224 

plugin.xml文件中讀取什麼特別的,並通過任何XML驗證不過,我可以找到,未成年人更改XML文件(刪除字符,添加字符等)有時會導致輸入流中「讀取的字節數」小於文件大小的情況。在這種情況下,我改變了與上述相同的文件的XML屬性的文本價值,並得到以下結果:

File size: 5218 
Bytes read: 5205 // the reader stopped early! 

我看不到方面的任何模式,其中XML文件將工作,這將不。這似乎是完全隨機的。

有沒有人遇到過這樣的事情?

編輯:忘了提及,讀取plugin.xml文件的Java代碼被嵌入到現成的應用程序中,我無法更改。我的問題是試圖瞭解爲什麼它在某些情況下不會接受我的XML文件。

回答

2

它在哪裏說InputStream.read()或其任何實現或覆蓋填充緩衝區?檢查Javadoc。實際上說的是,read()要麼返回-1指示EOS,要麼讀取至少一個字節到緩衝區。你必須循環。

+0

不幸的是,從ZIP讀取XML文件的代碼是我無法更改的供應商應用程序的一部分。我試圖理解爲什麼我的XML文件有時會被完全讀取,有時甚至沒有。似乎沒有一種模式。 – WayneC

+0

@WayneC然後向供應商投訴。如果這是他們的代碼,那就錯了。例如,它絕不會在套接字上運行。 '模式'是Java API中沒有任何東西需要它的工作,所以如果它能夠工作,那就是奇蹟。 – EJP

+0

原來他們有一個針對這個確切問題的補丁。我遺漏的是如果文件的壓縮大小小於緩衝區大小,它將工作。 – WayneC

0

如前所述,您需要使用循環。我不得不解決這個確切的問題,所以我想我會發表一個例子。

ZipInputStream zis = new ZipInputStream(is); 
ZipEntry entry = zis.getNextEntry(); 
while(entry != null) { 
    if(entry.getName().equals("plugin.xml")) { 
     int size = (int)entry.getSize(); 
     byte[] bytes = new byte[size]; 
     int read = 0; 
     while (read < size) { 
      read += zis.read(bytes, read, (size - read)); 
     } 

     System.out.println("File size: " + size); 
     System.out.println("Bytes read: " + read); 
    } 
}