web-dev-qa-db-ja.com

Java.util.Zip.ZipOutputStreamを使用する場合のZipファイル内のディレクトリ

ファイルt.txt、ディレクトリt、および別のファイルt/t2.txtがあるとします。 Linux Zipユーティリティ「Zip -r t.Zip t.txt t」を使用すると、次のエントリを含むZipファイルが取得されます(unzip -l t.Zip)。

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

Java.util.Zip.ZipOutputStreamでその動作を複製し、ディレクトリのZipエントリを作成しようとすると、Javaは例外をスローします。ファイルのみを処理できます。at/ t2を作成できます。 Zipファイルの.txtエントリと追加でt2.txtファイルの内容を使用しますが、ディレクトリを作成できません。なぜですか?

28
Bala

ZipOutputStreamcanスラッシュ/フォルダー名の後。試す( 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());
        }
    }
}
41
John Ellinwood

Java.util.Zip.ZipEntryのソースを調べてください。名前が「/」文字で終わる場合、ZipEntryをディレクトリとして扱います。ディレクトリ名の末尾に「/」を付けるだけです。

空のディレクトリだけを圧縮する場合は、この例を確認してください http://bethecoder.com/applications/tutorials/showTutorials.action?tutorialId=Java_ZipUtilities_ZipEmptyDirectory

幸運を。

23
user769087

他の人がここで空のディレクトリを追加すると言ったように、ディレクトリ名に「/」を追加します。空のファイルを実際にZipに追加するFile.separator(「\」に等しい)を追加しないように注意してください。

私の間違いを理解するのに時間がかかりました-他の時間を節約してください...

13
chenop

JavaプログラムからZip(フォルダーには空または完全なものが含まれます)

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);
                }
            }
        }
    }
}
13
programmmer

フォルダ名の末尾に「/」を追加できます。次のコマンドを使用するだけです。

Zip.putNextEntry(new ZipEntry("xml/"));
7
Black Light