Java實現檔案壓縮與解壓[zip格式,gzip格式]
Java實現ZIP的解壓與壓縮功能基本都是使用了Java的多肽和遞迴技術,可以對單個檔案和任意級聯資料夾進行壓縮和解壓,對於一些初學者來說是個很不錯的例項。
zip扮演著歸檔和壓縮兩個角色;gzip並不將檔案歸檔,僅只是對單個檔案進行壓縮,所以,在UNIX平臺上,命令tar通常用來建立一個檔案檔案,然後命令gzip來將檔案檔案壓縮。
Java I/O類庫還收錄了一些能讀寫壓縮格式流的類。要想提供壓縮功能,只要把它們包在已有的I/O類的外面就行了。這些類不是Reader和Writer,而是InputStream和OutStreamput的子類。這是因為壓縮演算法是針對byte而不是字元的。
相關類與介面:
Checksum 介面:被類Adler32和CRC32實現的介面
Adler32 :使用Alder32演算法來計算Checksum數目
CRC32 :使用CRC32演算法來計算Checksum數目
CheckedInputStream :InputStream派生類,可得到輸入流的校驗和Checksum,用於校驗資料的完整性
CheckedOutputStream :OutputStream派生類,可得到輸出流的校驗和Checksum, 用於校驗資料的完整性
DeflaterOutputStream :壓縮類的基類。
ZipOutputStream :DeflaterOutputStream的一個子類,把資料壓縮成Zip檔案格式。
GZIPOutputStream :DeflaterOutputStream的一個子類,把資料壓縮成GZip檔案格式
InflaterInputStream :解壓縮類的基類
ZipInputStream :InflaterInputStream的一個子類,能解壓縮Zip格式的資料
GZIPInputStream :InflaterInputStream的一個子類,能解壓縮Zip格式的資料
ZipEntry 類:表示 ZIP 檔案條目
ZipFile 類:此類用於從 ZIP 檔案讀取條目
使用ZIP對多個檔案進行壓縮與解壓
Java對Zip格式類庫支援得比較全面,得用它可以把多個檔案壓縮成一個壓縮包。這個類庫使用的是標準Zip格式,所以能與很多的壓縮工具相容。
ZipOutputStream類有設定壓縮方法以及在壓縮方式下使用的壓縮級別,zipOutputStream.setMethod(int method)設定用於條目的預設壓縮方法。只要沒有為單個 ZIP 檔案條目指定壓縮方法,就使用ZipOutputStream所設定的壓縮方法來儲存,預設值為 ZipOutputStream.DEFLATED(表示進行壓縮儲存),還可以設定成STORED(表示僅打包歸檔儲存)。ZipOutputStream在設定了壓縮方法為DEFLATED後,我們還可以進一步使用setLevel(int level)方法來設定壓縮級別,壓縮級別值為0-9共10個級別(值越大,表示壓縮越利害),預設為Deflater.DEFAULT_COMPRESSION=-1。當然我們也可以通過條目ZipEntry的setMethod方法為單個條件設定壓縮方法。
類ZipEntry描述了儲存在ZIP檔案中的壓縮檔案。類中包含有多種方法可以用來設定和獲得ZIP條目的資訊。類ZipEntry是被ZipFile[zipFile.getInputStream(ZipEntry entry)]和ZipInputStream使用來讀取ZIP檔案,ZipOutputStream來寫入ZIP檔案的。有以下這些有用的方法:getName()返回條目名稱、isDirectory()如果為目錄條目,則返回 true(目錄條目定義為其名稱以 ‘/’ 結尾的條目)、setMethod(int method) 設定條目的壓縮方法,可以為 ZipOutputStream.STORED 或 ZipOutputStream .DEFLATED。
下面例項我們使用了apache的zip工具包(所在包為ant.jar ),因為java型別自帶的不支援中文路徑,不過兩者使用的方式是一樣的,只是apache壓縮工具多了設定編碼方式的介面,其他基本上是一樣的。另外,如果使用org.apache.tools.zip.ZipOutputStream來壓縮的話,我們只能使用org.apache.tools.zip.ZipEntry來解壓,而不能使用java.util.zip.ZipInputStream來解壓讀取了,當然apache並未提供ZipInputStream類。
檔案壓縮:
package gizAction; import java.io.*; import java.util.zip.*; /** * @author Dana·Li * <p> * 程式實現了ZIP壓縮[compression] * <p> * 大致功能包括用了多型,遞迴等JAVA核心技術,可以對單個檔案和任意級聯資料夾進行壓縮和解壓。 需在程式碼中自定義源輸入路徑和目標輸出路徑。 * <p> * 在本段程式碼中,實現的是壓縮部分 */ public class ZipCompressing { private int k = 1; // 定義遞迴次數變數 private void zip(String zipFileName, File inputFile) throws Exception { System.out.println("壓縮中..."); ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); BufferedOutputStream bo = new BufferedOutputStream(out); zip(out, inputFile, inputFile.getName(), bo); bo.close(); out.close(); // 輸出流關閉 System.out.println("壓縮完成"); } private void zip(ZipOutputStream out, File f, String base, BufferedOutputStream bo) throws Exception { // 方法過載 if (f.isDirectory()){ File[] fl = f.listFiles(); if (fl.length == 0){ out.putNextEntry(new ZipEntry(base + "/")); // 建立zip壓縮排入點base System.out.println(base + "/"); } for (int i = 0; i < fl.length; i++) { zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 遞迴遍歷子資料夾 } System.out.println("第" + k + "次遞迴"); k++; } else { out.putNextEntry(new ZipEntry(base)); // 建立zip壓縮排入點base System.out.println(base); FileInputStream in = new FileInputStream(f); BufferedInputStream bi = new BufferedInputStream(in); int b; while ((b = bi.read()) != -1) { bo.write(b); // 將位元組流寫入當前zip目錄 } bi.close(); in.close(); // 輸入流關閉 } } /** * 測試 * @param args */ public static void main(String[] args) { ZipCompressing book = new ZipCompressing(); try { book.zip("F:\\ziptest.zip",new File("F:\\ziptest")); } catch (Exception e) { e.printStackTrace(); } } }
檔案解壓:
package gizAction; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * @author Dana·Li * <p> * 程式實現了ZIP解壓[decompression] * <p> * 大致功能包括用了多型,遞迴等JAVA核心技術,可以對單個檔案和任意級聯資料夾進行壓縮和解壓。 需在程式碼中自定義源輸入路徑和目標輸出路徑。 * <p> * 在本段程式碼中,實現的是解壓部分; */ public class zipDecompressing { public static void main(String[] args) { // TODO Auto-generated method stub long startTime=System.currentTimeMillis(); try { ZipInputStream Zin=new ZipInputStream(new FileInputStream( "F:\\ziptest.zip"));//輸入源zip路徑 BufferedInputStream Bin=new BufferedInputStream(Zin); String Parent="F:\\ziptest\\"; //輸出路徑(資料夾目錄) File Fout=null; ZipEntry entry; try { while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){ Fout=new File(Parent,entry.getName()); if(!Fout.exists()){ (new File(Fout.getParent())).mkdirs(); } FileOutputStream out=new FileOutputStream(Fout); BufferedOutputStream Bout=new BufferedOutputStream(out); int b; while((b=Bin.read())!=-1){ Bout.write(b); } Bout.close(); out.close(); System.out.println(Fout+"解壓成功"); } Bin.close(); Zin.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } long endTime=System.currentTimeMillis(); System.out.println("耗費時間: "+(endTime-startTime)+" ms"); } }
用GZIP進行對單個檔案壓縮
GZIP的介面比較簡單,因此如果你只需對一個流進行壓縮的話,可以使用它。當然它可以壓縮字元流,與可以壓縮位元組流,下面是一個對GBK編碼格式的文字檔案進行壓縮的。
壓縮類的用法非常簡單;只要用GZIPOutputStream 或ZipOutputStream把輸出流包起來,再用GZIPInputStream 或ZipInputStream把輸入流包起來就行了。剩下的都是些普通的I/O操作。
import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class GZIPcompress { public static void main(String[] args) throws IOException { //做準備壓縮一個字元檔案,注,這裡的字元檔案要是GBK編碼方式的 BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream( "e:/tmp/source.txt"), "GBK")); //使用GZIPOutputStream包裝OutputStream流,使其具體壓縮特性,最後會生成test.txt.gz壓縮包 //並且裡面有一個名為test.txt的檔案 BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream( new FileOutputStream("test.txt.gz"))); System.out.println("開始寫壓縮檔案..."); int c; while ((c = in.read()) != -1) { /* * 注,這裡是壓縮一個字元檔案,前面是以字元流來讀的,不能直接存入c,因為c已是Unicode * 碼,這樣會丟掉資訊的(當然本身編碼格式就不對),所以這裡要以GBK來解後再存入。 */ out.write(String.valueOf((char) c).getBytes("GBK")); } in.close(); out.close(); System.out.println("開始讀壓縮檔案..."); //使用GZIPInputStream包裝InputStream流,使其具有解壓特性 BufferedReader in2 = new BufferedReader(new InputStreamReader( new GZIPInputStream(new FileInputStream("test.txt.gz")), "GBK")); String s; //讀取壓縮檔案裡的內容 while ((s = in2.readLine()) != null) { System.out.println(s); } in2.close(); } }
相關文章
- java 生成 zip格式 壓縮檔案Java
- 壓縮檔案格式rar和zip有什麼區別 壓縮檔案格式rar和zip哪個好
- java 壓縮包 遍歷解壓 zip 和 7z 指定格式檔案Java
- 利用Java實現zip壓縮/解壓縮 (轉)Java
- java實現zip壓縮檔案/資料夾Java
- JAVA基礎:利用Java實現zip壓縮解壓縮(轉)Java
- ZipArchive解壓縮zip檔案Hive
- 使用jar與zip壓縮解壓檔案的區別JAR
- Linux科研武器庫 - 檔案壓縮與解壓縮 - zip / unzipLinux
- 壓縮檔案格式rar和zip有什麼區別 zip和rar哪個是無失真壓縮
- 使用gzip壓縮檔案
- Linux下常用壓縮格式的壓縮與解壓方法Linux
- java 把檔案壓縮成 zipJava
- android解壓縮GZIP格式的網頁資料Android網頁
- 過濾器實現檔案的gzip壓縮過濾器
- zip壓縮檔案處理方案(Zip4j壓縮和解壓)
- Linux下常用壓縮格式的壓縮與解壓方法---轉載Linux
- win10系統如何使用ACDSee檢視ZIP格式壓縮檔案Win10
- node ~ zip壓縮 && 檔案加密加密
- unix和linux下常用壓縮格式的壓縮與解壓方法(轉)Linux
- aix 檔案的壓縮與解壓縮AI
- Linux下常見檔案格式的壓縮、解壓小結(轉)Linux
- zip解壓縮
- Vue開啟gzip壓縮檔案Vue
- Android總結之Gzip/Zip壓縮Android
- 壓縮解壓命令(tar, zip)
- python 壓縮檔案並進行郵件傳送(附件格式為zip)Python
- 使用org.apache.tools.zip實現zip壓縮和解壓Apache
- Java使用Zip壓縮Java
- 分析核心對gzip壓縮檔案進行解壓的方法(轉)
- 關於Java的GZIP壓縮與.net C#的GZIP壓縮的差異JavaC#
- zip壓縮和解壓縮
- 用 Huffman 樹實現檔案壓縮並解壓
- Java實現解壓縮檔案和資料夾Java
- 哈夫曼實現檔案壓縮解壓縮(c語言)C語言
- .NET 壓縮/解壓檔案
- 檔案打包與解壓縮
- java解壓rar,解壓zipJava