Java ZipInputStream chiude dopo aver letto ZipEntry dell'immagine
Domanda
Stiamo cercando di modificare uno dei file XML nel 2007 di MS Excel. Per questo, il file xlsx viene decompresso utilizzando ZipInputStream di Java e poi copiato in un nuovo file Zip utilizzando ZipOutputStream. I frammenti di codice sono le seguenti:
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 questo frammento di codice, dopo incontriamo un file JPEG, la "entry = zis.getNextEntry ()" restituisce null. Non siamo in grado di leggere il prossimo ZipEntry - che porta ad un Excel incompleta. L'uscita di un file di Excel di esempio è il seguente:
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
Lo ZipInputStream viene chiuso non appena il file JPEG viene copiato. (Variabili entryEOF e reachEOF sia girano vera e l'ingresso è nullo dopo la copia dell'immagine).
Qualcuno ha affrontato un problema simile? Si tratta di un bug che reachEOF trasforma anche vero dopo aver copiato il file?
Midhun.
Soluzione
Questo è perché si leggono i dati per l'immagine da zis
anziché da zis.getInputStream(entry)
.
Dopo il ciclo di copia, tutti i dati da zis
saranno stati letti, in modo da ottenere un EOF.