2013-05-14 19 views
8

Sto cercando di creare un file zip di più file di immagine. Sono riuscito a creare il file zip di tutte le immagini ma in qualche modo tutte le immagini sono state impiccate a 950 byte. Non so che cosa sta andando storto qui e ora non riesco ad aprire le immagini sono state compresse in quel file zip.Come creare un file zip di più file di immagine

Ecco il mio codice. Qualcuno può farmi sapere cosa sta succedendo qui?

String path="c:\\windows\\twain32"; 
File f=new File(path); 
f.mkdir(); 
File x=new File("e:\\test"); 
x.mkdir(); 
byte []b; 
String zipFile="e:\\test\\test.zip"; 
FileOutputStream fout=new FileOutputStream(zipFile); 
ZipOutputStream zout=new ZipOutputStream(new BufferedOutputStream(fout)); 


File []s=f.listFiles(); 
for(int i=0;i<s.length;i++) 
{ 
    b=new byte[(int)s[i].length()]; 
    FileInputStream fin=new FileInputStream(s[i]); 
    zout.putNextEntry(new ZipEntry(s[i].getName())); 
    int length; 
    while((length=fin.read())>0) 
    { 
     zout.write(b,0,length); 
    } 
    zout.closeEntry(); 
    fin.close(); 
} 
zout.close(); 

risposta

9

Modifica questo:

while((length=fin.read())>0) 

a questo:

while((length=fin.read(b, 0, 1024))>0) 

e impostare la dimensione del buffer a 1024 byte:

b=new byte[1024]; 
+0

grazie funziona molto bene Hai risolto il problema grazie fratello grazie mille ....: D –

+1

se pensi che questa risposta sia appropriata, accettala. lo stesso vale per tutte le domande che hai fatto in passato – hoaz

14

Questa è la mia funzione di cerniera che uso sempre per qualsiasi struttura di file:

public static File zip(List<File> files, String filename) { 
    File zipfile = new File(filename); 
    // Create a buffer for reading the files 
    byte[] buf = new byte[1024]; 
    try { 
     // create the ZIP file 
     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile)); 
     // compress the files 
     for(int i=0; i<files.size(); i++) { 
      FileInputStream in = new FileInputStream(files.get(i).getCanonicalName()); 
      // add ZIP entry to output stream 
      out.putNextEntry(new ZipEntry(files.get(i).getName())); 
      // transfer bytes from the file to the ZIP file 
      int len; 
      while((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      // complete the entry 
      out.closeEntry(); 
      in.close(); 
     } 
     // complete the ZIP file 
     out.close(); 
     return zipfile; 
    } catch (IOException ex) { 
     System.err.println(ex.getMessage()); 
    } 
    return null; 
} 
+0

Grazie per questo esempio che funziona bene, tranne che ho dovuto modificare questa riga: FileInputStream in = new FileInputStream (files.get (i) .getCanonicalName()); –

+0

Ciao - hai ragione, per mantenere la struttura delle cartelle, è meglio usare * .getCanonicalName() Ho adattato questo alla mia risposta - grazie. – salocinx

+0

Ciao. Mi chiedo (i) perché non stiamo cancellando il buffer dopo l'istruzione out.write, il buffer non verrebbe sovraccaricato? (ii) quale dovrebbe essere la dimensione del buffer mantenuta in generale per le dimensioni dei file inferiori a 1 MB? –