今天做峰會活動候選人報名功能時,涉及一個打包下載附件的功能。
在這里記錄一下壓縮文件的實現過程,壓縮文件有多種實現方式。
這里記錄通過java本身自帶的ZipOutputStream類、或者Ant.jar下面的Zip類實現
1. Java本身自帶的類ZipOutputStream實現方式
public class ZipCompressor { static final int BUFFER = 8192; private File zipFile; /** * 創建一個壓縮實例 * * @param pathName 壓縮到的地址 */ public ZipCompressor(String pathName) { zipFile = new File(pathName); } /** * @Description: 執行壓縮 * @param srcPathName 被壓縮文件 */ public void compress(String srcPathName) { File file = new File(srcPathName); if (!file.exists()) { throw new RuntimeException(srcPathName + "不存在!"); } try { // 創建文件輸出流 FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); String basedir = ""; compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 判斷路徑是目錄還是文件 * @param file 被壓縮文件 * @param out 容器 * @param basedir 路徑 */ private void compress(File file, ZipOutputStream out, String basedir) { /* 判斷是目錄還是文件 */ if (file.isDirectory()) { System.out.println("壓縮:" + basedir + file.getName()); this.compressDirectory(file, out, basedir); } else { System.out.println("壓縮:" + basedir + file.getName()); this.compressFile(file, out, basedir); } } /** * @Description: 壓縮一個目錄 * @param dir * @param out * @param basedir */ private void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) { return; } // 獲取目錄下的所有文件 File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 遞歸 */ compress(files[i], out, basedir + dir.getName() + "/"); } } /** * @Description: 壓縮一個文件 * @param file * @param out * @param basedir */ private void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { return; } try { // 將被壓縮文件轉化為緩沖輸入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); // 創建壓縮包 ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry);// 壓縮文件名稱 int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { ZipCompressor zipCompressor = new ZipCompressor("F:\\yswj.zip"); zipCompressor.compress("F:\\Java\\資源及插件"); } }
2. 使用ant.jar下面的Zip類實現,該方式更簡單一些
public class ZipCompressorByAnt { private File zipFile; public ZipCompressorByAnt(String pathName) { zipFile = new File(pathName); } /** * @param srcPathName 壓縮目標 */ public void compress(String srcPathName) { File srcdir = new File(srcPathName); if (!srcdir.exists()) { throw new RuntimeException(srcPathName + "不存在!"); } Project prj = new Project(); Zip zip = new Zip(); zip.setProject(prj); zip.setDestFile(zipFile); FileSet fileSet = new FileSet(); fileSet.setProject(prj); fileSet.setDir(srcdir); //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java"); //fileSet.setExcludes(...); 排除哪些文件或文件夾 zip.addFileset(fileSet); zip.execute(); } public static void main(String[] args) { } }
ZipOutputStream實現方法代碼中有測試方法