【JAVA IO】_壓縮流筆記
本章目標:
瞭解壓縮流的主要作用
瞭解java io支援的三種壓縮格式
掌握ZipOutputStream、ZipFile、ZipInputStream三個類的作用
3、具體內容
ZipEntry
ZipOutputStream
負責將一個檔案或檔案夾壓縮成一個zip檔案。
執行個體代碼:
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipInputStream ;import java.io.FileInputStream ;public class ZipInputStreamDemo01{ public static void main(String args[]) throws Exception{ // 所有異常拋出 File zipFile = new File("d:" + File.separator + "mldn.zip") ; // 定義壓縮檔名稱 ZipInputStream input = null ; // 定義壓縮輸入資料流 input = new ZipInputStream(new FileInputStream(zipFile)) ; // 執行個體化ZIpInputStream ZipEntry entry = input.getNextEntry() ; // 得到一個壓縮實體 System.out.println("壓縮實體名稱:" + entry.getName()) ; input.close() ; }};
以上的作業碼完成的只是一個檔案的壓縮,如果要完成一個檔案夾呢?
import java.io.File ;import java.io.OutputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipFile ;import java.util.zip.ZipInputStream ;import java.io.FileInputStream ;import java.io.FileOutputStream ;public class ZipInputStreamDemo02{ public static void main(String args[]) throws Exception{ // 所有異常拋出 File file = new File("d:" + File.separator + "mldndir.zip") ; // 定義壓縮檔名稱 File outFile = null ; // 輸出檔案的時候要有檔案夾的操作 ZipFile zipFile = new ZipFile(file) ; // 執行個體化ZipFile對象 ZipInputStream zipInput = null ; // 定義壓縮輸入資料流 OutputStream out = null ; // 定義輸出資料流,用於輸出每一個實體內容 InputStream input = null ; // 定義輸入資料流,讀取每一個ZipEntry ZipEntry entry = null ; // 每一個壓縮實體 zipInput = new ZipInputStream(new FileInputStream(file)) ; // 執行個體化ZIpInputStream while((entry = zipInput.getNextEntry())!=null){ // 得到一個壓縮實體 System.out.println("解壓縮" + entry.getName() + "檔案。") ; outFile = new File("d:" + File.separator + entry.getName()) ; // 定義輸出的檔案路徑 if(!outFile.getParentFile().exists()){ // 如果輸出檔案夾不存在 outFile.getParentFile().mkdir() ; // 建立檔案夾 } if(!outFile.exists()){ // 判斷輸出檔案是否存在 outFile.createNewFile() ; // 建立檔案 } input = zipFile.getInputStream(entry) ; // 得到每一個實體的輸入資料流 out = new FileOutputStream(outFile) ; // 執行個體化檔案輸出資料流 int temp = 0 ; while((temp=input.read())!=-1){ out.write(temp) ; } input.close() ; // 關閉輸入資料流 out.close() ; // 關閉輸出資料流 } input.close() ; }};
3.2、ZipFile
是一個專門表示壓縮檔的類
ZipFile在執行個體化的時候必須接收File類的執行個體,此File類的執行個體是指向一個壓縮的*.zip檔案。
執行個體化時需要接收File類的引用
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.util.zip.ZipFile ;import java.io.FileOutputStream ;public class ZipFileDemo01{ public static void main(String args[]) throws Exception{ // 所有異常拋出 File file = new File("d:" + File.separator + "mldn.zip") ; // 找到壓縮檔 ZipFile zipFile = new ZipFile(file) ; // 執行個體化ZipFile對象 System.out.println("壓縮檔的名稱:" + zipFile.getName()) ; // 得到壓縮檔的名稱 }};
通過ZipFile檔案,為mldn.zip進行解壓縮操作。
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.io.OutputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.util.zip.ZipFile ;import java.io.FileOutputStream ;public class ZipFileDemo02{ public static void main(String args[]) throws Exception{ // 所有異常拋出 File file = new File("d:" + File.separator + "mldn.zip") ; // 找到壓縮檔 File outputFile = new File("d:" + File.separator + "mldn_unzip.txt") ; // 定義解壓縮的檔案名稱 ZipFile zipFile = new ZipFile(file) ; // 執行個體化ZipFile對象 ZipEntry entry = zipFile.getEntry("mldn.txt") ; // 得到一個壓縮實體 OutputStream out = new FileOutputStream(outputFile) ; // 執行個體化輸出資料流 InputStream input = zipFile.getInputStream(entry) ; // 得到一個壓縮實體的輸入資料流 int temp = 0 ; while((temp=input.read())!=-1){ out.write(temp) ; } input.close() ; // 關閉輸入資料流 out.close() ; // 關閉輸出資料流 }};
3.3、ZipInputStream
可以不用輸入實體名稱,就可以得到每一個ZipEntry對象。
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.io.FileOutputStream ;public class ZipOutputStreamDemo01{ public static void main(String args[]) throws Exception{ // 所有異常拋出 File file = new File("d:" + File.separator + "mldn.txt") ; // 定義要壓縮的檔案 File zipFile = new File("d:" + File.separator + "mldn.zip") ; // 定義壓縮檔名稱 InputStream input = new FileInputStream(file) ; // 定義檔案的輸入資料流 ZipOutputStream zipOut = null ; // 聲明壓縮流對象 zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ; zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 設定ZipEntry對象 zipOut.setComment("www.mldnjava.cn") ; // 設定注釋 int temp = 0 ; while((temp=input.read())!=-1){ // 讀取內容 zipOut.write(temp) ; // 壓縮輸出 } input.close() ; // 關閉輸入資料流 zipOut.close() ; // 關閉輸出資料流 }};
利用此特性並結合ZipFile就可以完成解壓縮檔案夾的功能。
ZipFile對象,可以找到每一個ZipEntry的輸入資料流,但是ZipInputStream並不能得到每一個輸入資料流,所以需要使用ZipFile,但是ZipInputStream在取得每一個ZipEntry的時候,不需要每一個ZipEntry的名稱。
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.io.FileOutputStream ;public class ZipOutputStreamDemo02{ public static void main(String args[]) throws Exception{ // 所有異常拋出 File file = new File("d:" + File.separator + "mldn") ; // 定義要壓縮的檔案夾 File zipFile = new File("d:" + File.separator + "mldndir.zip") ; // 定義壓縮檔名稱 InputStream input = null ; // 定義檔案輸入資料流 ZipOutputStream zipOut = null ; // 聲明壓縮流對象 zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ; zipOut.setComment("www.mldnjava.cn") ; // 設定注釋 int temp = 0 ; if(file.isDirectory()){ // 判斷是否是檔案夾 File lists[] = file.listFiles() ; // 列出全部檔案 for(int i=0;i<lists.length;i++){ input = new FileInputStream(lists[i]) ; // 定義檔案的輸入資料流 zipOut.putNextEntry(new ZipEntry(file.getName() +File.separator+lists[i].getName())) ; // 設定ZipEntry對象 while((temp=input.read())!=-1){ // 讀取內容 zipOut.write(temp) ; // 壓縮輸出 } input.close() ; // 關閉輸入資料流 } } zipOut.close() ; // 關閉輸出資料流 }};