如何使用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
的[ZipEntry.isDirectory(http://docs.oracle.com/javase/ 7/docs/api/java/util/zip/ZipEntry.html#isDirectory())states * ...将条目添加到Zip文件时,将目录条目定义为名称以'/'*结尾的条目,您只需要在条目名称中添加尾部斜线,不需要添加任何内容,只需输入 – MadProgrammer
非常感谢,这对我帮助很大。 – Uriel
@MadProgrammer提供了一个很好的观点 - 如果您试图让zip归档文件重新创建一个空文件夹,则需要插入一个ZipEntry,其文件名以斜杠结尾,并且不要添加内容。 –