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

问题描述:

我正在阅读本文,以了解如何使用Java压缩/解压缩文件。我使用this来指导我,它在压缩文件夹内的所有文件时效果很好,但是当我用包含更多文件夹的文件夹测试它时,它不起作用,它会抛出以下错误:如何使用Java将文件夹及其所有文件和子目录压缩/解压缩?

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:

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.java类代码可以将文件夹内的文件夹及其所有文件压缩成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 

因此,要解决你的算法,里面添加的isdirectory()的for循环,和然后递归地将任何子目录中的文件添加到zip。可能做到这一点的最好办法是有一个方法:

addDirectoryToZip(String prefix, File directory, ZipOutputStream out) 

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

+0

的[ZipEntry.isDirectory(http://docs.oracle.com/javase/ 7/docs/api/java/util/zip/ZipEntry.html#isDirectory())states * ...将条目添加到Zip文件时,将目录条目定义为名称以'/'*结尾的条目,您只需要在条目名称中添加尾部斜线,不需要添加任何内容,只需输入 – MadProgrammer

+0

非常感谢,这对我帮助很大。 – Uriel

+0

@MadProgrammer提供了一个很好的观点 - 如果您试图让zip归档文件重新创建一个空文件夹,则需要插入一个ZipEntry,其文件名以斜杠结尾,并且不要添加内容。 –