public static boolean zip(String zipFileName, File... files) {
log.info("壓縮: "+zipFileName);
ZipOutputStream out = null;
BufferedOutputStream bo = null;
try {
createDir(zipFileName);
out = new ZipOutputStream(new FileOutputStream(zipFileName));
for (int i = 0; i < files.length; i++) {
if (null != files[i]) {
zip(out, files[i], files[i].getName());
}
}
out.close(); // 輸出流關閉
log.info("壓縮完成");
return true;
} catch (Exception e) {
log.error(e.getMessage());
}
return false;
}
/**
* 執行壓縮
* @param out ZIP輸入流
* @param f 被壓縮的文件
* @param base 被壓縮的文件名
*/
private static void zip(ZipOutputStream out, File f, String base) { // 方法重載
try {
if (f.isDirectory()) {//壓縮目錄
try {
File[] fl = f.listFiles();
if (fl.length == 0) {
out.putNextEntry(new ZipEntry(base + "/")); // 建立zip實體
log.info(base + "/");
}
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + "/" + fl[i].getName()); // 遞歸遍歷子文件夾
}
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
}
}else{ //壓縮單個文件
log.info(base);
out.putNextEntry(new ZipEntry(base)); // 建立zip實體
FileInputStream in = new FileInputStream(f);
BufferedInputStream bi = new BufferedInputStream(in);
int b;
while ((b = bi.read()) != -1) {
out.write(b); // 將字節流寫入當前zip目錄
}
out.closeEntry(); //關閉zip實體
in.close(); // 輸入流關閉
}
} catch (IOException e) {
log.error(e.getMessage());
}
}
/**
* 目錄不存在時,先建立目錄
* @param zipFileName
*/
private static void createDir(String zipFileName){
String filePath = StringUtils.substringBeforeLast(zipFileName, "/");
File targetFile = new File(filePath);
if (!targetFile.exists()) {//目錄不存在時,先建立目錄
targetFile.mkdirs();
}
}.net