Java Zip 压缩
最近需要使用到 Java 对多个文件进行压缩打包,而 Java 提供的基本的 Zip 功能并不能满足我的需求,因此在此基础上,我对其进行了封装已满足我的需求。其实,我的需求也并不复杂,就是将多个文件通过 zip 打包到一个压缩文件中,由于之前没有怎么接触过 Java,因此在这里记录一下,以方便以后查询。
实现
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Zip {
public static void main(String[] args) {
zip("cplusplus", "cplusplus/a.out", "cplusplus/test.cc", "cplusplus/writing/ShortPath.java");
}
/**
* 压缩给定的文件到 *zipFileName* 中
* @param zipFileName 压缩后的文件名,函数会在该文件名后添加 zip 后缀
* @param filenames 待压缩文件名
* @return true - 成功, false - 失败
*/
public static boolean zip(String zipFileName, String ... filenames) {
try {
ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName + ".zip"));
for (String name : filenames) {
File file = new File(name);
if (file != null) {
zip(outputStream, file, file.getName());
}
}
outputStream.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 递归压缩
* @param out Zip 的输出流
* @param file 待压缩的文件对象
* @param filename 待压缩的文件名
* @note 若 file 为目录时,该函数将递归的压缩其子目录
*/
public static void zip(ZipOutputStream out, File file, String filename) throws IOException {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files.length == 0) {
out.putNextEntry(new ZipEntry(filename + "/"));
}
for (File f : files) {
zip(out, f, filename + "/" + f.getName());
}
} else {
out.putNextEntry(new ZipEntry(filename));
FileInputStream inputStream = new FileInputStream(file);
BufferedInputStream bi = new BufferedInputStream(inputStream);
int b;
while ((b = bi.read()) != -1) {
out.write(b);
}
out.closeEntry();
inputStream.close();
}
}
}