// 定义一个公共的静态方法zipFolder,用于压缩文件夹
// 参数sourceFolderPath是源文件夹的路径,zipFilePath是压缩后的zip文件路径
public static boolean zipFolder(String sourceFolderPath, String zipFilePath) {
// 创建一个File对象,表示源文件夹
File sourceFile = new File(sourceFolderPath);
try (
// 创建一个FileOutputStream对象,用于向指定的zip文件路径写入数据
FileOutputStream fos = new FileOutputStream(zipFilePath);
// 创建一个ZipOutputStream对象,用于将压缩数据写入到FileOutputStream中
ZipOutputStream zos = new ZipOutputStream(fos)
) {
// 调用zipFile方法,开始压缩文件
zipFile(sourceFile, sourceFile.getName(), zos);
return true;
} catch (IOException e) {
// 如果在压缩过程中出现异常,打印异常堆栈信息
e.printStackTrace();
}
return false;
}
// 定义一个私有的静态方法zipFile,用于递归地压缩文件和文件夹
// 参数fileToZip是需要被压缩的文件或文件夹,fileName是其在zip中的名称,zos是ZipOutputStream对象
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
// 如果fileToZip是一个隐藏文件,则不进行压缩,直接返回
if (fileToZip.isHidden()) {
return;
}
// 如果fileToZip是一个目录(文件夹)
if (fileToZip.isDirectory()) {
// 如果fileName以"/"结尾,说明已经是一个目录路径,直接创建一个ZipEntry并关闭它
if (fileName.endsWith("/")) {
zos.putNextEntry(new ZipEntry(fileName));
zos.closeEntry();
} else {
// 否则,需要在fileName后加上"/",表示这是一个目录路径,然后创建一个ZipEntry并关闭它
zos.putNextEntry(new ZipEntry(fileName + "/"));
zos.closeEntry();
}
// 获取fileToZip目录下的所有文件和子目录
File[] children = fileToZip.listFiles();
for (File childFile : children) {
// 递归调用zipFile方法,压缩子文件和子目录
zipFile(childFile, fileName + "/" + childFile.getName(), zos);
}
return;
}
// 如果fileToZip不是一个目录,那么它就是一个文件,需要被压缩
// 创建一个FileInputStream对象,用于读取fileToZip的内容
FileInputStream fis = new FileInputStream(fileToZip);
// 创建一个ZipEntry对象,表示fileToZip在zip文件中的条目
ZipEntry zipEntry = new ZipEntry(fileName);
// 在ZipOutputStream中开始一个新的zip条目(即将写入一个文件的内容)
zos.putNextEntry(zipEntry);
// 创建一个byte数组,作为缓冲区,用于从fileToZip读取数据并写入到zos中
byte[] bytes = new byte[1024];
int length;
// 使用循环从fis中读取数据,并写入到zos中,直到没有数据可读(返回-1)为止
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
// 关闭FileInputStream对象,释放资源
fis.close();
}
public static void main(String[] args) {
String sourceFolder = "path/to/your/source/folder"; // 请替换为源文件夹路径
String zipDestination = "path/to/your/destination.zip"; // 请替换为目标zip文件路径
zipFolder(sourceFolder, zipDestination);
}