如何使用Java压缩/解压缩文件夹及其所有文件和子目录?

时间:2012-09-16 19:14:24

标签: java file compression directory zipfile

我正在阅读本文以了解如何使用Java压缩/解压缩文件。我使用this来指导我,并且在压缩文件夹中的所有文件时效果很好,但是当我使用包含更多文件夹的文件夹对其进行测试时,它不起作用,它引发了以下错误:

java.io.FileNotFoundException: assets (Access is denied) //assets is the name of the folder I tried to zip
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at Zip.main(Zip.java:24)

这是我正在使用的课程,因为您会看到它与上一个链接中的代码示例4:Zip.java 类代码相同:

import java.io.*;
import java.util.zip.*;

public class Zip {
   static final int BUFFER = 2048;
   public void zip() {
      try {
         BufferedInputStream origin = null;
         FileOutputStream dest = new 
           FileOutputStream("H:\\myfigs.zip");
         CheckedOutputStream checksum = new 
           CheckedOutputStream(dest, new Adler32());
         ZipOutputStream out = new 
           ZipOutputStream(new 
             BufferedOutputStream(checksum));
         //out.setMethod(ZipOutputStream.DEFLATED);
         byte data[] = new byte[BUFFER];
         // get a list of files from current directory
         File f = new File(".");
         String files[] = f.list();

         for (int i=0; i<files.length; i++) {
            System.out.println("Adding: "+files[i]);
            FileInputStream fi = new 
              FileInputStream(files[i]);
            origin = new 
              BufferedInputStream(fi, BUFFER);
            ZipEntry entry = new ZipEntry(files[i]);
            out.putNextEntry(entry);
            int count;
            while((count = origin.read(data, 0, 
              BUFFER)) != -1) {
               out.write(data, 0, count);
            }
            origin.close();
         }
         out.close();
         System.out.println("checksum: "+checksum.getChecksum().getValue());
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
} 

应该进行哪些更改,以便此代码可以将文件夹及其所有文件中的文件夹压缩为zip文件?

1 个答案:

答案 0 :(得分:5)

zip条目需要指定存档内文件的路径。您无法将文件夹添加到zip存档 - 您只能添加文件夹中的文件。

命名约定是使用正斜杠作为路径分隔符。如果要使用以下文件/子目录压缩文件夹:

c:\foo\bar\a.txt
c:\foo\bar\sub1\b.txt
c:\foo\bar\sub2\c.txt

zip条目名称为:

a.txt
sub1/b.txt
sub2/c.txt

因此,要修复算法,请在for循环中添加isDirectory(),然后以递归方式将任何子目录中的文件添加到zip中。可能最好的方法是使用方法:

addDirectoryToZip(String prefix, File directory, ZipOutputStream out)

以下是该问题的解决方案:java.util.zip - Recreating directory structure

相关问题