对文件夹进行压缩,保留目录层级,以及空文件夹代码。
public class ZipExample {
public static void main(String[] args) {
String zipFileName = "D://ruanjian//aaa//temp//example.tar";
String folderToCompress = "D://ruanjian//bbb//temp";
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFileName))) {
File sourceDir = new File(folderToCompress);
// 压缩文件夹
compressFolder(sourceDir, sourceDir, zipOutputStream);
System.out.println("Folder compressed successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void compressFolder(File rootDir, File currentDir, ZipOutputStream zipOutputStream) throws IOException {
File[] files = currentDir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (file.isDirectory()) {
// 压缩子文件夹
compressFolder(rootDir, file, zipOutputStream);
} else {
// 压缩文件
addToZipFile( rootDir, file, zipOutputStream);
}
}
}else {
// 处理空文件夹
String relativePath = currentDir.getPath().substring(rootDir.getPath().length() + 1)+ "/";;
ZipEntry entry = new ZipEntry(relativePath);
zipOutputStream.putNextEntry(entry);
zipOutputStream.closeEntry();
}
}
private static void addToZipFile(File rootDir, File file, ZipOutputStream zipOutputStream) throws IOException {
String relativePath = file.getPath().substring(rootDir.getPath().length() + 1);
// 创建ZipEntry对象并设置文件名
ZipEntry entry = new ZipEntry(relativePath);
zipOutputStream.putNextEntry(entry);
// 读取文件内容并写入Zip文件
try (FileInputStream fileInputStream = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
zipOutputStream.write(buffer, 0, bytesRead);
}
}
// 完成当前文件的压缩
zipOutputStream.closeEntry();
}
}