java中提供了對壓縮格式的數據流的讀寫。它們封裝到現成的IO 類中,以提供壓縮功能。下面我們開始java中壓縮文件的使用。
目錄導航:
關於壓縮的簡要說明
一、 Java中有着壓縮的類:
- CheckedInputStream GetCheckSum()為任何InputStream 產生校驗和(不僅是解壓)
- CheckedOutputStream GetCheckSum()為任何OutputStream 產生校驗和(不僅是解壓)
- DeflaterOutputStream 用於壓縮類的基礎類
- ZipOutputStream 一個DeflaterOutputStream,將數據壓縮成Zip 文件格式
- GZIPOutputStream 一個DeflaterOutputStream,將數據壓縮成GZIP 文件格式
- InflaterInputStream 用於解壓類的基礎類
- ZipInputStream 一個DeflaterInputStream,解壓用Zip 文件格式保存的數據
- GZIPInputStream 一個DeflaterInputStream,解壓用GZIP 文件格式保存的數據
二、 壓縮庫的一些說明:
- 壓縮類庫是按字節方式而不是字符方式處理的,它們屬於InputStream和OutputStream繼承層次結構的一部分
三、 ZIP壓縮的使用注意:
- 對於要加入壓縮檔的每一個文件,都必須調用putNextEntry(),並將其傳遞給一個ZipEntry 對象。
- ZipEntry 對象包含了一個功能全面的接口,利用它可以獲取和設置Zip 文件內那個特定的Entry(入口)上能夠接受的所有數據:名字、壓縮后和壓縮前的長度、日期、CRC 校驗和、額外字段的數據、注釋、壓縮方法以及它是否一個目錄入口等等。
- 盡管CheckedInputStream 和CheckedOutputStream 同時提供了對Adler32 和CRC32 校驗和的支持,但是ZipEntry 只支持CRC 的接口
- 為解壓文件,ZipInputStream 提供了一個getNextEntry()方法,能在有的前提下返回下一個ZipEntry
- 可以用ZipFile 對象讀取文件。該對象有一個entries()方法,可以為ZipEntry 返回一個Enumeration(枚舉)。
GZIP壓縮文件的使用
我們通過一個簡單的程序用例來展開今天壓縮類的使用講解 ,程序結構如下
一、 我們創建一個GzipCompress類,用於GZIP壓縮類的測試:首先是壓縮文件方法compress():
// 壓縮文件 private static void compress() throws Exception { BufferedReader in = new BufferedReader(new FileReader(("compress/test.txt"))); BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("uncompress/test.gz"))); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.close(); }
二、 我們創建GZIP的解壓縮方法:uncompress()
// 解壓縮文件 private static void uncompress() throws Exception { BufferedReader in = new BufferedReader( new InputStreamReader(new GZIPInputStream(new FileInputStream("uncompress/test.gz")))); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); }
三、 在Main方法運行,得到如下結果:
- 控制台打印: Hello World.
- 在uncompress文件夾下生成test.gz文件
ZIP壓縮文件的使用
一、 我們創建一個ZipCompress類,用於GZIP壓縮類的測試:
首先是壓縮文件方法compress():壓縮huhx.png,test2.txt, test3.txt, test4.txt文件
private final static String[] resources = new String[] { "huhx.png", "test2.txt", "test3.txt", "test4.txt" }; // 壓縮文件 private static void compress() throws Exception { FileOutputStream f = new FileOutputStream("uncompress/test.zip"); CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32()); ZipOutputStream zos = new ZipOutputStream(csum); BufferedOutputStream out = new BufferedOutputStream(zos); zos.setComment("A test of java zipping"); ZipEntry entry = null; for (String resource : resources) { System.out.println("writing file: " + resource); BufferedReader in = new BufferedReader(new FileReader("compress/" + resource)); entry = new ZipEntry(resource); entry.setComment(resource + " comments"); zos.putNextEntry(entry); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.flush(); } out.close(); System.out.println("checksum: " + csum.getChecksum().getValue()); }
二、 我們創建ZIP的解壓縮方法:uncompress1()
// 解壓縮文件 private static void uncompress1() throws Exception { FileInputStream fi = new FileInputStream("uncompress/test.zip"); CheckedInputStream csum = new CheckedInputStream(fi, new Adler32()); ZipInputStream in2 = new ZipInputStream(csum); BufferedInputStream bis = new BufferedInputStream(in2); ZipEntry ze; while ((ze = in2.getNextEntry()) != null) { System.out.println("reading file: " + ze.getName()); } System.out.println("checksum: " + csum.getChecksum().getValue()); bis.close(); }
三、 我們創建ZIP的解壓縮另外一種方法:uncompress2()
// 解壓縮文件 private static void uncompress2() throws Exception { ZipFile zf = new ZipFile("uncompress/test.zip"); Enumeration<?> e = zf.entries(); while (e.hasMoreElements()) { ZipEntry entry = (ZipEntry) e.nextElement(); System.out.println("File: " + entry.getComment()); } zf.close(); }
四、 運行compress()和uncompress1()方法,得到結果如下:

五、 運行compress()和uncompress2()方法,得到結果如下:

GZIP與ZIP壓縮的比較
- GZIP: 如果只有單個數據流需要壓縮(而不是一系列不同的數據),那么它就可能是最適當選擇。
- ZIP: 它可以方便地保存多個文件。甚至有一個獨立的類來簡化對Zip 文件的讀操作
友情鏈接
- 測試項目源代碼下載 訪問密碼 56c3
