java原生通过java.util.zip.zipoutputstream压缩多个文件为zip,需为每个文件创建zipentry、调用putnextentry写入条目头、写入字节后立即closeentry,路径须用正斜杠/且为相对路径,空目录需显式添加以/结尾的zipentry并设size为0,中文名应使用jdk7+带utf-8 charset的构造器。

压缩多个文件的核心步骤
必须为每个文件显式创建 ZipEntry,调用 putNextEntry 开启条目,写入原始字节后,立刻调用 closeEntry。漏掉 closeEntry() 或跳过 putNextEntry(),ZIP 文件就损坏,多数解压工具打不开。
- 用
FileOutputStream包装ZipOutputStream - 对每个待压缩文件,计算其相对于根目录的 相对路径(如
"docs/report.pdf"),避免绝对路径(如"C:\a.txt") - 路径分隔符统一用正斜杠
/,即使在 Windows 上也要替换掉 - 调用
zos.putNextEntry(new ZipEntry(entryName)) - 用
Files.copy(file, zos)或手动字节流写入内容 - 必须紧接着调用
zos.closeEntry()
保留目录结构和空文件夹
ZIP 不自动包含空目录。若源中有 src/test/ 这个空文件夹,想保留在压缩包里,就得手动添加一个以 / 结尾的条目:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造
new ZipEntry("src/test/") - 调用
entry.setSize(0)显式声明这是个目录 - 再
putNextEntry和closeEntry
中文文件名怎么不乱码
标准 ZipOutputStream 默认用 IBM437 编码,中文会变问号或报错。解决方式有二:
- JDK 7 及以上:用带
Charset的构造器,如new ZipOutputStream(fos, StandardCharsets.UTF_8)(但注意 Windows 资源管理器仍可能不识别) - 更稳妥:改用 Apache Commons Compress 的
ZipArchiveOutputStream,它默认启用 UTF-8 并兼容主流解压工具
安全与资源管理
务必用 try-with-resources 自动关闭流,否则 ZIP 文件可能写不全:
- 包裹
FileOutputStream和ZipOutputStream - 内部读取单个文件时,也建议用
Files.newInputStream()配合 try-with-resources - 不要手动调用
flush(),close()已隐含 finish 操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










