Java IO _壓縮流

1、瞭解壓縮流的主要作用

2、瞭解JAVA IO 支持的三種壓縮格式

3、掌握ZipOutputStream、ZipFile、ZipInputStream 三個類的作用

具體內容

經常可以看見各種壓縮文件:zip、jar、GZ、



正常情況下在IO 操作中,所有的類庫都是在 IO 包中。


在實例化ZipEntry 的時候,要設置名稱,此名稱實際上就是壓縮文件中每一個元素的名稱。

1、ZipOutputStream


此類的功能就是完成ZIP格式輸出的。

繼承關係:

java.lang.Object
  java.io.OutputStream
      java.io.FilterOutputStream
          java.util.zip.DeflaterOutputStream
              java.util.zip.ZipOutputStream

從定義可以發現,就是一個字節的輸出流。

public void putNextEntry(ZipEntry e)
                  throws IOException
在壓縮文件中,每一個壓縮的內容都可以用一個ZipEntry 表示,所以在進行壓縮之前必須通過putNextEntry 設置一個ZipEntry 即可。

[java] view plain copy
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.io.FileOutputStream ;  
  7. public class ZipOutputStreamDemo01{  
  8.     public static void main(String args[]) throws Exception{    // 所有異常拋出  
  9.         File file = new File("d:" + File.separator + "mldn.txt") ;  // 定義要壓縮的文件  
  10.         File zipFile = new File("d:" + File.separator + "mldn.zip") ;   // 定義壓縮文件名稱  
  11.         InputStream input = new FileInputStream(file) ; // 定義文件的輸入流  
  12.         ZipOutputStream zipOut = null ; // 聲明壓縮流對象  
  13.         zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
  14.         zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 設置ZipEntry對象  
  15.         zipOut.setComment("www.mldnjava.cn") ;  // 設置註釋  
  16.         int temp = 0 ;  
  17.         while((temp=input.read())!=-1){ // 讀取內容  
  18.             zipOut.write(temp) ;    // 壓縮輸出  
  19.         }  
  20.         input.close() ; // 關閉輸入流  
  21.         zipOut.close() ;    // 關閉輸出流  
  22.     }  
  23. };  
以上的操作代碼完成的只是一個文件的壓縮,如果要完成一個文件夾呢?


[java] view plain copy
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.io.FileOutputStream ;  
  7. public class ZipOutputStreamDemo02{  
  8.     public static void main(String args[]) throws Exception{    // 所有異常拋出  
  9.         File file = new File("d:" + File.separator + "mldn") ;  // 定義要壓縮的文件夾  
  10.         File zipFile = new File("d:" + File.separator + "mldndir.zip") ;    // 定義壓縮文件名稱  
  11.         InputStream input = null ;  // 定義文件輸入流  
  12.         ZipOutputStream zipOut = null ; // 聲明壓縮流對象  
  13.         zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
  14.         zipOut.setComment("www.mldnjava.cn") ;  // 設置註釋  
  15.         int temp = 0 ;  
  16.         if(file.isDirectory()){ // 判斷是否是文件夾  
  17.             File lists[] = file.listFiles() ;   // 列出全部文件  
  18.             for(int i=0;i<lists.length;i++){  
  19.                 input = new FileInputStream(lists[i]) ; // 定義文件的輸入流  
  20.                 zipOut.putNextEntry(new ZipEntry(file.getName()  
  21.                     +File.separator+lists[i].getName())) ;  // 設置ZipEntry對象  
  22.                 while((temp=input.read())!=-1){ // 讀取內容  
  23.                     zipOut.write(temp) ;    // 壓縮輸出  
  24.                 }  
  25.                 input.close() ; // 關閉輸入流  
  26.             }  
  27.         }  
  28.         zipOut.close() ;    // 關閉輸出流  
  29.     }  
  30. };  
3.2 ZipFile

是一個專門表示壓縮文件的類。

ZipFile 在實例化的時候必須接收File 類的實例。此File 類的實例是指向一個壓縮 *.zip 文件。

第一步:爲 ZipFile 實例化

實例化時需要接收File  類的引用

[java] view plain copy
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.util.zip.ZipFile ;  
  7. import java.io.FileOutputStream ;  
  8. public class ZipFileDemo01{  
  9.     public static void main(String args[]) throws Exception{    // 所有異常拋出  
  10.         File file = new File("d:" + File.separator + "mldn.zip") ;  // 找到壓縮文件  
  11.         ZipFile zipFile = new ZipFile(file) ;   // 實例化ZipFile對象  
  12.         System.out.println("壓縮文件的名稱:" + zipFile.getName()) ;    // 得到壓縮文件的名稱  
  13.     }  
  14. };  

通過ZipFile 文件,爲mldn.zip 進行解壓縮操作。

[java] view plain copy
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.io.FileOutputStream ;  
  7. public class ZipOutputStreamDemo02{  
  8.     public static void main(String args[]) throws Exception{    // 所有異常拋出  
  9.         File file = new File("d:" + File.separator + "mldn") ;  // 定義要壓縮的文件夾  
  10.         File zipFile = new File("d:" + File.separator + "mldndir.zip") ;    // 定義壓縮文件名稱  
  11.         InputStream input = null ;  // 定義文件輸入流  
  12.         ZipOutputStream zipOut = null ; // 聲明壓縮流對象  
  13.         zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
  14.         zipOut.setComment("www.mldnjava.cn") ;  // 設置註釋  
  15.         int temp = 0 ;  
  16.         if(file.isDirectory()){ // 判斷是否是文件夾  
  17.             File lists[] = file.listFiles() ;   // 列出全部文件  
  18.             for(int i=0;i<lists.length;i++){  
  19.                 input = new FileInputStream(lists[i]) ; // 定義文件的輸入流  
  20.                 zipOut.putNextEntry(new ZipEntry(file.getName()  
  21.                     +File.separator+lists[i].getName())) ;  // 設置ZipEntry對象  
  22.                 while((temp=input.read())!=-1){ // 讀取內容  
  23.                     zipOut.write(temp) ;    // 壓縮輸出  
  24.                 }  
  25.                 input.close() ; // 關閉輸入流  
  26.             }  
  27.         }  
  28.         zipOut.close() ;    // 關閉輸出流  
  29.     }  
  30. };  
以上的操作中,有一個問題,必須知道壓縮文件中的每一個壓縮實體的名稱纔可以進行解壓縮操作,而如果現在在假設是一個文件夾呢? 
3、ZipInputStream

定義:

java.lang.Object
  java.io.InputStream
      java.io.FilterInputStream
          java.util.zip.InflaterInputStream
              java.util.zip.ZipInputStream

[java] view plain copy
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipInputStream ;  
  6. import java.io.FileInputStream ;  
  7. public class ZipInputStreamDemo01{  
  8.     public static void main(String args[]) throws Exception{    // 所有異常拋出  
  9.         File zipFile = new File("d:" + File.separator + "mldn.zip") ;   // 定義壓縮文件名稱  
  10.         ZipInputStream input = null ;   // 定義壓縮輸入流  
  11.         input = new ZipInputStream(new FileInputStream(zipFile)) ;  // 實例化ZIpInputStream  
  12.         ZipEntry entry = input.getNextEntry() ; // 得到一個壓縮實體  
  13.         System.out.println("壓縮實體名稱:" + entry.getName()) ;  
  14.         input.close() ;  
  15.     }  
  16. };  
利用此特性並結合 ZipFile 就可以完成解壓縮文件夾的功能。

ZipFile 對象,可以找到每一個ZipEntry 的輸入流。但是ZipInputStream 並不能得到每一個輸入流,所以需要使用ZipFile,但是ZipInputStream  在取得每一個ZipEntry 的時候,不需要每一個ZipEntry 的時候,不需要每一個ZipEntry 的名稱。

[java] view plain copy
  1. import java.io.File ;  
  2. import java.io.OutputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipFile ;  
  6. import java.util.zip.ZipInputStream ;  
  7. import java.io.FileInputStream ;  
  8. import java.io.FileOutputStream ;  
  9. public class ZipInputStreamDemo02{  
  10.     public static void main(String args[]) throws Exception{    // 所有異常拋出  
  11.         File file = new File("d:" + File.separator + "mldndir.zip") ;   // 定義壓縮文件名稱  
  12.         File outFile = null ;   // 輸出文件的時候要有文件夾的操作  
  13.         ZipFile zipFile = new ZipFile(file) ;   // 實例化ZipFile對象  
  14.         ZipInputStream zipInput = null ;    // 定義壓縮輸入流  
  15.         OutputStream out = null ;   // 定義輸出流,用於輸出每一個實體內容  
  16.         InputStream input = null ;  // 定義輸入流,讀取每一個ZipEntry  
  17.         ZipEntry entry = null ; // 每一個壓縮實體  
  18.         zipInput = new ZipInputStream(new FileInputStream(file)) ;  // 實例化ZIpInputStream  
  19.         while((entry = zipInput.getNextEntry())!=null){ // 得到一個壓縮實體  
  20.             System.out.println("解壓縮" + entry.getName() + "文件。") ;  
  21.             outFile = new File("d:" + File.separator + entry.getName()) ;   // 定義輸出的文件路徑  
  22.             if(!outFile.getParentFile().exists()){  // 如果輸出文件夾不存在  
  23.                 outFile.getParentFile().mkdir() ;   // 創建文件夾  
  24.             }  
  25.             if(!outFile.exists()){  // 判斷輸出文件是否存在  
  26.                 outFile.createNewFile() ;   // 創建文件  
  27.             }  
  28.             input = zipFile.getInputStream(entry) ; // 得到每一個實體的輸入流  
  29.             out = new FileOutputStream(outFile) ;   // 實例化文件輸出流  
  30.             int temp = 0 ;  
  31.             while((temp=input.read())!=-1){  
  32.                 out.write(temp) ;  
  33.             }  
  34.             input.close() ;     // 關閉輸入流  
  35.             out.close() ;   // 關閉輸出流  
  36.         }  
  37.         input.close() ;  
  38.     }  
  39. };  
如果目錄不存在,則應該進行創建操作。

總結:

1、壓縮文件中的每一個壓縮實體都使用ZipEntry 保存,一個壓縮文件中可能包含一個或多個的ZipEntry 對象。

2、在JAVA中可以進行zip、jar、gz、三種格式的壓縮支持,操作流程基本上是一樣的

3、ZipOutputStream 可以進行壓縮輸出,但是輸出的位置不一定是文件。

4、ZipFile 表示每一個壓縮文件,可以得到每一個壓縮實體的輸入流

5、ZipInputStream 可以得到每一個實體,但是卻無法得到每一個實體的輸入流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章