Java 原生支援主流壓縮格式,核心類別:
ZipOutputStream / ZipInputStream:串流式壓縮/解壓ZipFile:隨機存取 ZIP 檔案ZipEntry:代表壓縮包內單一檔案/目錄條目GZIPOutputStream / GZIPInputStream:單檔 GZIP 壓縮(Linux 常用)JarOutputStream / JarInputStream:JAR 專用(繼承 ZIP,支援 Manifest)try (ZipOutputStream zos = new ZipOutputStream(
new FileOutputStream("out.zip"), StandardCharsets.UTF_8)) {
zos.putNextEntry(new ZipEntry("data.txt"));
Files.copy(Paths.get("data.txt"), zos);
zos.closeEntry();
}
void zipDir(File dir, ZipOutputStream zos, String parent) throws IOException {
for (File f : dir.listFiles()) {
String entryName = parent.isEmpty() ? f.getName() : parent + "/" + f.getName();
if (f.isDirectory()) {
zipDir(f, zos, entryName);
} else {
zos.putNextEntry(new ZipEntry(entryName));
Files.copy(f.toPath(), zos);
zos.closeEntry();
}
}
}
try (ZipFile zipFile = new ZipFile("in.zip", StandardCharsets.UTF_8);
ZipInputStream zis = new ZipInputStream(new FileInputStream("in.zip"), StandardCharsets.UTF_8)) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
Path target = Paths.get("out", entry.getName());
if (entry.isDirectory()) {
Files.createDirectories(target);
} else {
Files.createDirectories(target.getParent());
try (OutputStream os = Files.newOutputStream(target)) {
zis.transferTo(os); // Java 9+
}
}
zis.closeEntry();
}
}
Charset.forName("UTF-8") 或 StandardCharsets.UTF_8,避免中文檔名亂碼InputStream.transferTo(OutputStream)Zip64 模式支援 4GB+ 檔案(JDK 7+ 自動啟用)JarOutputStream 自動寫入 META-INF/MANIFEST.MF;可透過 Manifest 類自訂屬性.tar.gzDeflater.setLevel(Deflater.BEST_COMPRESSION) / BEST_SPEEDMappedByteBuffer 減少堆拷貝掌握 java.util.zip 體系,即可在無第三方依賴下完成企業級壓縮解壓需求。