2010-12-06 10 views
2

Wir versuchen, eine der XML-Dateien in 2007 MS Excel zu ändern. Dazu wird die xlsx-Datei mit ZipInputStream von Java entpackt und dann mit ZipOutputStream in eine neue Zip-Datei kopiert. Die Code-Schnipsel sind wie folgt:Java ZipInputStream schließt nach dem Lesen ZipEntry des Bildes

 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(); 

In diesem Code-Schnipsel, nachdem wir eine JPEG-Datei auftreten, die "entry = zis.getNextEntry()" gibt null zurück. Wir können den nächsten ZipEntry nicht lesen - was zu einem unvollständigen Excel führt. Die Ausgabe für eine Probe Excel-Datei ist wie folgt:

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 

Die ZipInputStream so schnell geschlossen wird, wie die JPEG-Datei kopiert wird. (EntryEOF- und RopeEOF-Variablen werden nach dem Kopieren des Bildes wahr und der Eintrag ist null).

Hat jemand ein ähnliches Problem konfrontiert? Ist es ein Fehler, dass reachEOF auch nach dem Kopieren der Datei wahr wird?

Midhun.

Antwort

3

Dies liegt daran, dass Sie die Daten für das Bild von zis anstelle von zis.getInputStream(entry) lesen.

Nach der Kopierschleife werden alle Daten von zis gelesen, so dass Sie einen EOF erhalten.

Verwandte Themen