2010-06-10 13 views
18

Per esempio, voglio comprimere un file memorizzato in /Users/me/Desktop/image.jpgCome faccio a comprimere i file in Java e non includere i percorsi dei file

Ho fatto questo metodo:

public static Boolean generateZipFile(ArrayList<String> sourcesFilenames, String destinationDir, String zipFilename){ 
    // Create a buffer for reading the files 
    byte[] buf = new byte[1024]; 

    try { 
    // VER SI HAY QUE CREAR EL ROOT PATH 
     boolean result = (new File(destinationDir)).mkdirs(); 

     String zipFullFilename = destinationDir + "/" + zipFilename ; 

     System.out.println(result); 

    // Create the ZIP file 
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFullFilename)); 
    // Compress the files 
    for (String filename: sourcesFilenames) { 
    FileInputStream in = new FileInputStream(filename); 
    // Add ZIP entry to output stream. 
    out.putNextEntry(new ZipEntry(filename)); 
    // 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 true; 
    } catch (IOException e) { 
    return false; 
    } 
} 

Ma quando estraggo il file, i file decompressi hanno il percorso completo.

Non voglio il percorso completo di ogni file nello zip voglio solo il nome del file.

Come posso fare questo?

risposta

31

Qui:

// Add ZIP entry to output stream. 
out.putNextEntry(new ZipEntry(filename)); 

si sta creando la voce per quel file utilizzando l'intero percorso. Se si basta usare il nome (senza il percorso) avrai quello che ti serve:

// Add ZIP entry to output stream. 
File file = new File(filename); //"Users/you/image.jpg" 
out.putNextEntry(new ZipEntry(file.getName())); //"image.jpg" 
2

Stai cercando i tuoi dati di origine utilizzando il percorso relativo al file, quindi imposta la voce sulla stessa cosa. Invece si dovrebbe trasformare il sorgente in un oggetto File, e quindi utilizzare

putNextEntry (nuova ZipEntry (sourceFile.getName()))

che ti do solo la parte finale del percorso (ad esempio, la nome del file effettivo)

+0

grazie !!!! funziona benissimo – Ignacio

1

fare as Jason said, o se si desidera mantenere la firma del metodo, fare in questo modo:

out.putNextEntry(new ZipEntry(new File(filename).getName())); 

o, usando FileNameUtils.getName da Apache Commons/IO:

out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename))); 
0

Probabilmente si potrebbe get away accedere ai file di origine tramite il nuovo FileInputStream (nuovo File (sourceFilePath, sourceFileName)).

0
// easy way of zip a file 

import java.io. *;

import java.util.zip.*; 

public class ZipCreateExample{ 

    public static void main(String[] args) throws Exception { 
      // input file 
     FileInputStream in = new FileInputStream("F:/ZipCreateExample.txt");; 
     // out put file 
     ZipOutputStream out =new ZipOutputStream(new FileOutputStrea("F:/tmp.zip")); 
     // name of file in zip folder 
     out.putNextEntry(new ZipEntry("zippedfile.txt")); 

     byte[] b = new byte[1024]; 

     int count; 

     // writing files to new zippedtxt file 
     while ((count = in.read(b)) > 0) { 
      System.out.println(); 

     out.write(b, 0, count); 
     } 
     out.close(); 
     in.close(); 
    } 
} 
0
try { 
    String zipFile = "/locations/data.zip"; 
    String srcFolder = "/locations"; 

    File folder = new File(srcFolder); 
    String[] sourceFiles = folder.list(); 

    //create byte buffer 
    byte[] buffer = new byte[1024]; 

    /* 
    * To create a zip file, use 
    * 
    * ZipOutputStream(OutputStream out) constructor of ZipOutputStream 
    * class. 
    */ 
    //create object of FileOutputStream 
    FileOutputStream fout = new FileOutputStream(zipFile); 

    //create object of ZipOutputStream from FileOutputStream 
    ZipOutputStream zout = new ZipOutputStream(fout); 

    for (int i = 0; i < sourceFiles.length; i++) { 
     if (sourceFiles[i].equalsIgnoreCase("file.jpg") || sourceFiles[i].equalsIgnoreCase("file1.jpg")) { 
      sourceFiles[i] = srcFolder + fs + sourceFiles[i]; 
      System.out.println("Adding " + sourceFiles[i]); 
      //create object of FileInputStream for source file 
      FileInputStream fin = new FileInputStream(sourceFiles[i]); 

      /* 
      * To begin writing ZipEntry in the zip file, use 
      * 
      * void putNextEntry(ZipEntry entry) method of 
      * ZipOutputStream class. 
      * 
      * This method begins writing a new Zip entry to the zip 
      * file and positions the stream to the start of the entry 
      * data. 
      */ 

      zout.putNextEntry(new ZipEntry(sourceFiles[i].substring(sourceFiles[i].lastIndexOf("/") + 1))); 

      /* 
      * After creating entry in the zip file, actually write the 
      * file. 
      */ 
      int length; 

      while ((length = fin.read(buffer)) > 0) { 
       zout.write(buffer, 0, length); 
      } 

      /* 
      * After writing the file to ZipOutputStream, use 
      * 
      * void closeEntry() method of ZipOutputStream class to 
      * close the current entry and position the stream to write 
      * the next entry. 
      */ 

      zout.closeEntry(); 

      //close the InputStream 
      fin.close(); 

     } 
    } 

    //close the ZipOutputStream 
    zout.close(); 

    System.out.println("Zip file has been created!"); 

} catch (IOException ioe) { 
    System.out.println("IOException :" + ioe); 
} 
0

Se si zip due file con lo stesso nome ma con percorsi diversi si incorrere in errori di immissione di file duplicati, però.

Problemi correlati