2009-04-11 4 views
22

Sagen wir, ich habe eine Datei t.txt, ein Verzeichnis t und eine andere Datei t/t2.txt. Wenn ich das Linux-Zip-Programm verwenden "zip -r t.zip t.txt t", ich eine ZIP-Datei mit den folgenden Einträgen in ihnen bekommen (unzip -l t.zip):Verzeichnisse in einer Zip-Datei bei der Verwendung von java.util.zip.ZipOutputStream

Archive: t.zip 
    Length  Date Time Name 
--------  ----  ----  ---- 
     9 04-11-09 09:11 t.txt 
     0 04-11-09 09:12 t/ 
     15 04-11-09 09:12 t/t2.txt 
--------       ------- 
     24       3 files 

Wenn ich versuche, Um dieses Verhalten mit java.util.zip.ZipOutputStream zu replizieren und einen Zip-Eintrag für das Verzeichnis zu erstellen, löst java eine Ausnahme aus. Es kann nur Dateien verarbeiten. Ich kann einen t/t2.txt-Eintrag in der ZIP-Datei erstellen und den Inhalt der Datei t2.txt hinzufügen, aber ich kann das Verzeichnis nicht erstellen. Warum das?

Antwort

30

ZipOutputStreamkönnen leere Verzeichnisse behandeln durch einen Schrägstrich / nach dem Ordnernamen hinzufügen. Versuchen (from)

public class Test { 
    public static void main(String[] args) { 
     try { 
      FileOutputStream f = new FileOutputStream("test.zip"); 
      ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(f)); 
      zip.putNextEntry(new ZipEntry("xml/")); 
      zip.putNextEntry(new ZipEntry("xml/xml")); 
      zip.close(); 
     } catch(Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 
+3

Sie sind falsch John. Zip-Dateien behandeln leere Verzeichnisse problemlos. Der Trick ist, dass Sie am Ende des Namens einen Schrägstrich setzen müssen. –

6

Sie können hinzufügen "/" am Ende des Ordnernamens. Verwenden Sie einfach den folgenden Befehl:

zip.putNextEntry(new ZipEntry("xml/")); 
12

Java-Programm Zip (Ordner enthält entweder leer oder Vollen)

public class ZipUsingJavaUtil { 
    /* 
    * Zip function zip all files and folders 
    */ 
    @Override 
    @SuppressWarnings("finally") 
    public boolean zipFiles(String srcFolder, String destZipFile) { 
     boolean result = false; 
     try { 
      System.out.println("Program Start zipping the given files"); 
      /* 
      * send to the zip procedure 
      */ 
      zipFolder(srcFolder, destZipFile); 
      result = true; 
      System.out.println("Given files are successfully zipped"); 
     } catch (Exception e) { 
      System.out.println("Some Errors happned during the zip process"); 
     } finally { 
      return result; 
     } 
    } 

    /* 
    * zip the folders 
    */ 
    private void zipFolder(String srcFolder, String destZipFile) throws Exception { 
     ZipOutputStream zip = null; 
     FileOutputStream fileWriter = null; 
     /* 
     * create the output stream to zip file result 
     */ 
     fileWriter = new FileOutputStream(destZipFile); 
     zip = new ZipOutputStream(fileWriter); 
     /* 
     * add the folder to the zip 
     */ 
     addFolderToZip("", srcFolder, zip); 
     /* 
     * close the zip objects 
     */ 
     zip.flush(); 
     zip.close(); 
    } 

    /* 
    * recursively add files to the zip files 
    */ 
    private void addFileToZip(String path, String srcFile, ZipOutputStream zip, boolean flag) throws Exception { 
     /* 
     * create the file object for inputs 
     */ 
     File folder = new File(srcFile); 

     /* 
     * if the folder is empty add empty folder to the Zip file 
     */ 
     if (flag == true) { 
      zip.putNextEntry(new ZipEntry(path + "/" + folder.getName() + "/")); 
     } else { /* 
       * if the current name is directory, recursively traverse it 
       * to get the files 
       */ 
      if (folder.isDirectory()) { 
       /* 
       * if folder is not empty 
       */ 
       addFolderToZip(path, srcFile, zip); 
      } else { 
       /* 
       * write the file to the output 
       */ 
       byte[] buf = new byte[1024]; 
       int len; 
       FileInputStream in = new FileInputStream(srcFile); 
       zip.putNextEntry(new ZipEntry(path + "/" + folder.getName())); 
       while ((len = in.read(buf)) > 0) { 
        /* 
        * Write the Result 
        */ 
        zip.write(buf, 0, len); 
       } 
      } 
     } 
    } 

    /* 
    * add folder to the zip file 
    */ 
    private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception { 
     File folder = new File(srcFolder); 

     /* 
     * check the empty folder 
     */ 
     if (folder.list().length == 0) { 
      System.out.println(folder.getName()); 
      addFileToZip(path, srcFolder, zip, true); 
     } else { 
      /* 
      * list the files in the folder 
      */ 
      for (String fileName : folder.list()) { 
       if (path.equals("")) { 
        addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip, false); 
       } else { 
        addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip, false); 
       } 
      } 
     } 
    } 
} 
+3

Sie sollten Ihren * FileInputStream * schließen. – CSchulz

+1

Insgesamt sollten Sie FileInputStream schließen. Das ist aber so schön! – Phuong

+0

Eine API-Improvisation: Habe ein ** 'zipFiles (final String [] srcFolders, final String destZipFile)' ** um mehrere Ordner deiner Zip-Datei hinzuzufügen. Einfach durch Hinzufügen einer for-Schleife in der 'zipFolder'-Methode. Einzelne und mehrere Ordner können mit diesen Methoden sehr einfach in eine Zip-Datei eingefügt werden. – Velth

9

Wie andere hier gesagt leeres Verzeichnis hinzuzufügen, fügen Sie „/“ auf den Verzeichnisnamen. Achten Sie darauf, dass Sie File.separator (entspricht "\") NICHT hinzufügen, um der ZIP-Datei eine leere Datei hinzuzufügen.

Es dauerte eine Weile, um zu verstehen, was war mein Fehler - hoffe, ich spare andere Zeit ...