Autore Topic: GZip va, Zip no, why?  (Letto 638 volte)

Offline Lycenhol

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7
  • Sistema operativo:
    Winzoz 7
GZip va, Zip no, why?
« il: 24 Novembre 2013, 20:50:00 CET »
0
Ho un problema. Ho fatto una libreria con un metodo che salva un oggetto su file zippandolo.
Il codice iniziale l'ho scritto usando GZIPInput ed Output Stream.
Perchè ora se sostituisco con ZipInputStream ed Output non va? Non dovrebbero essere intercambiabili?

Codice: [Seleziona]
        public jTree load (String fn) {
                jTree jt = null;
               
                // Read an object
                try {
                        // Read from disk using FileInputStream
                        FileInputStream f_in = new FileInputStream(fn);
                       
                        GZIPInputStream zis = new GZIPInputStream(f_in);
                       
                        // Read object using ObjectInputStream
                        ObjectInputStream obj_in = new ObjectInputStream (zis);
                       
                        jt = (jTree) obj_in.readObject();
                       
                        obj_in.close();
                        f_in.close();
                } catch (IOException e) {
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                }
               
                return jt;
        }
       
       
        public boolean save (String fn) {
                // Write to disk with FileOutputStream
                boolean result = false;
               
                try {
                        FileOutputStream f_out = new FileOutputStream(fn);
                        GZIPOutputStream zos = new GZIPOutputStream(f_out);
                       
                        // Write object with ObjectOutputStream
                        ObjectOutputStream obj_out = new ObjectOutputStream (zos);
                       
                        // Write object out to disk
                        obj_out.writeObject ( this );
                       
                        obj_out.close();
                        f_out.close();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
               
                return result;
        }

L'eccezione che mi lancia è la seguente:

Codice: [Seleziona]
java.util.zip.ZipException: no current ZIP entry
        at java.util.zip.ZipOutputStream.write(Unknown Source)
        at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
        at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
        at java.io.ObjectOutputStream.<init>(Unknown Source)
        at en.devApp.corsoJava.jTree.save(jTree.java:588)
        at en.devApp.corsoJava.Prova.prova1_jTree(Prova.java:14)
        at en.devApp.corsoJava.Prova.main(Prova.java:80)
java.io.EOFException
        at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
        at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
        at java.io.ObjectInputStream.<init>(Unknown Source)
        at en.devApp.corsoJava.jTree.load(jTree.java:563)
        at en.devApp.corsoJava.Prova.prova1_jTree(Prova.java:16)
        at en.devApp.corsoJava.Prova.main(Prova.java:80)
Exception in thread "main" java.lang.NullPointerException
        at en.devApp.corsoJava.Prova.prova1_jTree(Prova.java:18)
        at en.devApp.corsoJava.Prova.main(Prova.java:80)

Grazie degli aiuti

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:GZip va, Zip no, why?
« Risposta #1 il: 25 Novembre 2013, 08:36:48 CET »
0
Perchè ora se sostituisco con ZipInputStream ed Output non va? Non dovrebbero essere intercambiabili?

Che io sappia non sono intercambiabili sino alla singola riga di codice, fosse anche solamente perchè il GZIP agisce su file singolo, mentre ZIP è un containter di file multipli.

Faccio copia e incolla dalla pagina dove spiega come usare ZIP (sic!), mi sa che il tuo problema è l'assenza di ZipEntry.:

Codice (Java): [Seleziona]
 OutputStream os = ...
 ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
 try {
     for (int i = 0; i < fileCount; ++i) {
         String filename = ...
         byte[] bytes = ...
         ZipEntry entry = new ZipEntry(filename);
         zos.putNextEntry(entry);
         zos.write(bytes);
         zos.closeEntry();
     }
 } finally {
     zos.close();
 }
 
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Lycenhol

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 7
  • Sistema operativo:
    Winzoz 7
Re:GZip va, Zip no, why?
« Risposta #2 il: 25 Novembre 2013, 13:57:17 CET »
0
Che io sappia non sono intercambiabili sino alla singola riga di codice, fosse anche solamente perchè il GZIP agisce su file singolo, mentre ZIP è un containter di file multipli.

Faccio copia e incolla dalla pagina dove spiega come usare ZIP (sic!), mi sa che il tuo problema è l'assenza di ZipEntry.:

Codice (Java): [Seleziona]
 OutputStream os = ...
 ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
 try {
     for (int i = 0; i < fileCount; ++i) {
         String filename = ...
         byte[] bytes = ...
         ZipEntry entry = new ZipEntry(filename);
         zos.putNextEntry(entry);
         zos.write(bytes);
         zos.closeEntry();
     }
 } finally {
     zos.close();
 }
 

Intanto grazie per il tuo tempo e per la tua risposta.
Mi hai confermato quello che era un sospetto: GZip funziona perchè non ha bisogno di ridirezionare il flusso di dati su un sub file interno all'archivio. Immagino sia questo il motivo per cui si usa sempre il tar in associazione con gzip: il primo serve per matenere la struttura delle directory, mentre il secondo comprime in un "mestolotto" unico.

Ora mi studio meglio Zip e vedo come implementarlo con lui.

Grazie ancora!