Java實現檔案壓縮
阿新 • • 發佈:2018-11-05
1.壓縮
package com.zhuifeng.common.util; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; /** * * @author zhuifeng * * 檔案壓縮工具類 */ public class ZipTool { /** * inputFileName 輸入一個資料夾 * zipFileName 輸出一個壓縮資料夾 * basedir 輸入檔案路徑 */ private static void compress(File file, ZipOutputStream out, String basedir) { /* 判斷是目錄還是檔案 */ if (file.isDirectory()) { // System.out.println("壓縮:" + basedir + file.getName()); compressDirectory(file, out, basedir); } else { // System.out.println("壓縮:" + basedir + file.getName()); compressFile(file, out, basedir); } } /** 壓縮一個目錄 */ /** * inputFileName 輸入一個資料夾 * zipFileName 輸出一個壓縮資料夾 * basedir 輸入位置 */ private static 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() + "/"); } } /** 壓縮一個檔案 */ /** * inputFileName 輸入一個資料夾 * zipFileName 輸出一個壓縮資料夾 * basedir 輸入位置 */ private static 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()); Properties pro=System.getProperties(); String osName=pro.getProperty("os.name"); if("Linux".equals(osName)||"linux".equals(osName)){ entry.setUnixMode(644); } out.putNextEntry(entry); int count; byte data[] = new byte[8192]; while ((count = bis.read(data, 0, 8192)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * * @param srcPathName 原輸入檔案 * @param zipFileName zip輸入檔案 */ public static void zip(String srcPathName, String zipFileName,String basedir) { File file = new File(srcPathName); File zipFile = new File(zipFileName); 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); Properties pro=System.getProperties(); String osName=pro.getProperty("os.name"); if("Linux".equals(osName)||"linux".equals(osName)){ out.setEncoding("GBK");//設定檔名編碼方式 }else{ out.setEncoding(System.getProperty("sun.jnu.encoding"));//設定檔名編碼方式 } compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { zip("D:\\test\\20161009154206000","D:\\test\\2.zip",""); } }
2.解壓
package com.zhuifeng.common.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * * @author zhuifeng * 解壓工具類 * */ public class UnZip { /** * * @param zipFilePath zip路徑 * @param destDir 解壓後存放的位置 */ public static void unzip(String zipFilePath, String destDir) { System.setProperty("sun.zip.encoding", System.getProperty("sun.jnu.encoding")); File dir = new File(destDir); if (!dir.exists()) dir.mkdirs(); FileInputStream fis = null; ZipInputStream zis = null; byte[] buffer = new byte[1024]; try { fis = new FileInputStream(zipFilePath); zis = new ZipInputStream(fis); ZipEntry ze = zis.getNextEntry(); while (ze != null) { String fileName = ze.getName(); File newFile = new File(destDir + File.separator + fileName); new File(newFile.getParent()).mkdirs(); FileOutputStream fos = new FileOutputStream(newFile); int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); zis.closeEntry(); ze = zis.getNextEntry(); } if (zis != null) { zis.closeEntry(); zis.close(); } if (fis != null) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (zis != null) { zis.closeEntry(); zis.close(); } } catch (IOException e) { } } } }