/*
* SimpleJavaZip.java 只能对文件进行压缩,但是我们在实际应用中, 更加需要的是对目录进行压缩.
* 因此,需要对上面的 程序进行修改, 让它可以处理目录. 我们的基本思路是, 定义一个方法用于压缩文件,
* 接收一个参数, 表示需要压缩的文件列表. 根据这个参数, 首先判断指定的 File 对象是文件还是目录,
* 然后对这些文件对象递归调用本方法; 如果是文件, 则直接进行压缩操作.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipDir {
public void zip(String zipFileName, String[] inputFiles) throws Exception {
File temp = null;
for (int i = 0; i < inputFiles.length; ++i) {
temp = new File(inputFiles[i]);
zip(zipFileName, temp);
}
}
public void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFileName));
if (inputFile.isDirectory()) {
zip(out, inputFile, "");
} else {
zip(out, inputFile, inputFile.getName());
}
System.out.println("压缩完成!");
out.close();
}
public void zip(ZipOutputStream out, File f, String base) throws Exception {
System.out.println("正在压缩: " + f.getName() + "... ...");
if (f.isDirectory()) {
System.out.println("新建目录: " + f.getName());
File[] files = f.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
System.out.println(base);
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < files.length; ++i) {
// 对本目录下的所有文件对象递归调用本方法
zip(out, files[i], base + files[i].getName());
}
} else {
System.out.println("新增文件: " + f.getName());
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
in.close();
}
}
public static void main(String[] args) {
try {
ZipDir t = new ZipDir();
t.zip("c://test.zip", args);
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 这个程序的关键步骤都写出了注释. 通过这个程序可以实现目录的压缩
*/
}