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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top