Java.util.zip 提供用於讀寫標准 ZIP 和 GZIP 文件格式的類。
還包括使用 DEFLATE 壓縮算法(用於 ZIP 和 GZIP 文件格式)對數據進行壓縮和解壓縮的類。
依賴 Jdk 編寫該工具類,不依賴任何第三方 jar,隨用隨取,實現功能大體如下:
1.目錄級別遞歸壓縮與解壓縮 zip;
2.單文件壓縮和解壓縮 zip ;
import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** * 通過Java的Zip輸入輸出流實現壓縮和解壓文件 */ public final class ZipUtil { private ZipUtil() { } /** * 壓縮文件 * * @param filePath 待壓縮的文件路徑 * @return 壓縮後的文件 */ public static File zip(String filePath) { File target = null; File source = new File(filePath); if (source.exists()) { String sourceName = source.getName(); String zipName = sourceName.contains(".") ? sourceName.substring(0, sourceName.indexOf(".")) : sourceName; target = new File(source.getParent(), zipName + ".rar"); if (target.exists()) { boolean delete = target.delete();//刪除舊的壓縮包 } FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(target); zos = new ZipOutputStream(new BufferedOutputStream(fos)); addEntry(null, source, zos); //添加對應的文件Entry } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtil.closeQuietly(zos, fos); } } return target; } /** * 掃描添加文件Entry * * @param base 基路徑 * @param source 源文件 * @param zos Zip文件輸出流 * @throws IOException */ private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException { String entry = (base != null) ? base + source.getName() : source.getName(); //按目錄分級,形如:aaa/bbb.txt if (source.isDirectory()) { File[] files = source.listFiles(); if (files != null && files.length > 0) { for (File file : files) { addEntry(entry + "/", file, zos);// 遞歸列出目錄下的所有文件,添加文件 Entry } } } else { FileInputStream fis = null; BufferedInputStream bis = null; try { byte[] buffer = new byte[1024 * 10]; fis = new FileInputStream(source); bis = new BufferedInputStream(fis, buffer.length); int read; zos.putNextEntry(new ZipEntry(entry)); //如果只是想將文件夾下的所有文件壓縮,不需名要壓縮父目錄,約定文件名長度 entry.substring(length) while ((read = bis.read(buffer, 0, buffer.length)) != -1) { zos.write(buffer, 0, read); } zos.closeEntry(); } finally { IOUtil.closeQuietly(bis, fis); } } } /** * 解壓文件 * * @param filePath 壓縮文件路徑 */ public static void unzip(String filePath) { File source = new File(filePath); if (source.exists()) { ZipInputStream zis = null; BufferedOutputStream bos = null; try { zis = new ZipInputStream(new FileInputStream(source)); ZipEntry entry; while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) { File target = new File(source.getParent(), entry.getName()); if (!target.getParentFile().exists()) { target.getParentFile().mkdirs(); } bos = new BufferedOutputStream(new FileOutputStream(target)); int read; byte[] buffer = new byte[1024 * 10]; while ((read = zis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, read); } bos.flush(); } zis.closeEntry(); } catch (IOException e) { throw new RuntimeException(e); } finally { IOUtil.closeQuietly(zis, bos); } } } }
輸入輸出 工具類IOUtil :
import java.io.Closeable; import java.io.IOException; /** * IO流工具類 */ public class IOUtil { /** * 關閉一個或多個流對象 * @param closeables 可關閉的流對象列表 * @throws IOException */ public static void close(Closeable... closeables) throws IOException { if (closeables != null) { for (Closeable closeable : closeables) { if (closeable != null) { closeable.close(); } } } } /** * 關閉一個或多個流對象 */ public static void closeQuietly(Closeable... closeables) { try { close(closeables); } catch (IOException e) { // do nothing } } }