Java內建java.util.zip處理壓縮雖方便,但不支援中文檔名/目錄名,遇到中文即打包失敗,這是許多開發者踩過的坑。
經實測,Apache Ant庫中的org.apache.tools.zip套件完美支援中文路徑。取得途徑多樣:應用伺服器通常內建,或從Tomcat 5.x的ant.jar提取均可使用。
import java.io.*;
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.zip.ZipEntry;
public class CompressBook {
public void zip(String inputFileName) throws Exception {
String zipFileName = "c:/test.zip";
zip(zipFileName, new File(inputFileName));
}
private void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
zip(out, inputFile, "");
System.out.println("zip done");
out.close();
}
private void zip(ZipOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
base = base.isEmpty() ? "" : base + "/";
for (File file : fl) {
zip(out, file, base + file.getName());
}
} else {
out.putNextEntry(new ZipEntry(base));
try (FileInputStream in = new FileInputStream(f)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
}
}
}
關鍵改進點:使用緩衝陣列批次讀寫替代逐位元組操作,大幅提升效能;ZipEntry路徑處理更健壯。
無論java.util.zip或org.apache.tools.zip均無法解壓RAR格式。Java生態圈缺乏原生RAR解壓庫,期待高手分享解決方案。目前建議:伺服器端可呼叫系統unrar指令,或使用第三方商業庫。