2010-12-06 73 views
2

我們試圖修改2007 MS Excel中的一個XML文件。爲此,使用Java的ZipInputStream將xlsx文件解壓縮,然後使用ZipOutputStream複製到新的Zip文件。該代碼片段如下:在閱讀ZipEntry後,Java ZipInputStream關閉圖像

 FileInputStream fis = new FileInputStream("C:\\_132139TRD-GDR_Conversion.xlsx"); 
     ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 

     FileOutputStream fos = new FileOutputStream("C:\\_132139TRD-GDR_Conversion123.xlsx"); 
     ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos)); 

     while ((entry = zis.getNextEntry()) != null) { 

      System.out.println("Processing Entry : " + entry.getName()); 
      System.out.println("Processing Entry Size : " + entry.getSize()); 
      System.out.println("Entry Available : " + zis.available()); 

     if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){ 
      //Process XML 
     } 

     ZipEntry ze = new ZipEntry(entry.getName()); 
      zos.putNextEntry(ze); 
      if(entry.getName().equals(ZIP_ENTRY_WOOKBOOK_XML)){ 
        zos.write(XML.getBytes()); 
      }else{ 
       ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
       while ((count = zis.read(data, 0, BUFFER)) != -1) { 
        stream.write(data, 0, count); 
       } 
       tempBuffer = stream.toByteArray(); 
       zos.write(tempBuffer); 
      } 
      zos.closeEntry();    
     } 
     zos.close(); 
     fos.close(); 
     zis.close(); 
     fis.close(); 

在這個片段中,我們遇到一個JPEG文件後,「入門= zis.getNextEntry()」返回null。我們無法讀取下一個ZipEntry - 這導致Excel不完整。示例Excel文件的輸出如下:

Start Date Mon Dec 06 15:33:33 IST 2010 
Processing Entry : xl/media/Logo2005_JPM_A_Black_170x50.jpeg 
Processing Entry Size : -1 
Entry Available : 1 
End Date Mon Dec 06 15:34:58 IST 2010 

一旦JPEG文件被複制,ZipInputStream就會關閉。 (在複製圖像後,entryEOF和reachEOF變量都變爲true並且條目爲空)。

有人遇到過類似的問題嗎?複製文件後,達到EOF的錯誤是否也變爲真?

Midhun。

回答

3

這是因爲您從zis而不是zis.getInputStream(entry)讀取圖像的數據。

經過複製循環後,所有來自zis的數據都將被讀取,因此您將獲得EOF。