核心API解析
1. 压缩流程
try (ZipOutputStream zos = new ZipOutputStream(
new BufferedOutputStream(Files.newOutputStream(Paths.get("output.zip")))) {
zos.putNextEntry(new ZipEntry("data.txt")); // 创建新条目
Files.copy(Paths.get("source.txt"), zos); // 写入数据
zos.closeEntry(); // 关闭当前条目
}
2. 解压实战(解决中文乱码)
try (ZipInputStream zis = new ZipInputStream(
new BufferedInputStream(Files.newInputStream(Paths.get("input.zip")))) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
// 关键:处理中文文件名
String fileName = new String(entry.getName().getBytes("ISO-8859-1"), "GBK");
Path output = Paths.get("extract/", fileName);
Files.createDirectories(output.getParent());
Files.copy(zis, output, StandardCopyOption.REPLACE_EXISTING);
}
}
高级技巧
1. 目录压缩递归实现
public static void addDirToZip(ZipOutputStream zos, Path dir, String baseDir) throws IOException {
Files.walk(dir).forEach(path -> {
String entryName = baseDir + dir.relativize(path).toString();
if (Files.isDirectory(path)) entryName += "/";
try {
zos.putNextEntry(new ZipEntry(entryName));
if (!Files.isDirectory(path)) Files.copy(path, zos);
zos.closeEntry();
} catch (IOException e) { throw new UncheckedIOException(e); }
});
}
特别提示
1. 压缩比优化
设置Deflater.BEST_COMPRESSION提升压缩率
2. Zip炸弹防护
解压前校验文件大小:
if (entry.getSize() > MAX_UNCOMPRESSED_SIZE) {
throw new SecurityException("解压文件过大,疑似Zip炸弹");
}
结语
掌握Java Zip操作需关注三大要点:流式API的正确关闭顺序、中文等特殊字符编码处理、安全防护机制。本文代码经JDK 17实测验证,可直接集成到生产环境。建议结合NIO的Files.walk()实现高效目录遍历,满足现代应用需求。
Java操作Zip全攻略及技巧
1917

被折叠的 条评论
为什么被折叠?



