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 即可。
- 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() ; // 關閉輸出流
- }
- };
- 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() ; // 關閉輸出流
- }
- };
是一個專門表示壓縮文件的類。
ZipFile 在實例化的時候必須接收File 類的實例。此File 類的實例是指向一個壓縮 *.zip 文件。
第一步:爲 ZipFile 實例化
實例化時需要接收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.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() ; // 關閉輸出流
- }
- };
3、ZipInputStream
定義:
java.lang.Object java.io.InputStream java.io.FilterInputStream java.util.zip.InflaterInputStream java.util.zip.ZipInputStream
- 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() ;
- }
- };
ZipFile 對象,可以找到每一個ZipEntry 的輸入流。但是ZipInputStream 並不能得到每一個輸入流,所以需要使用ZipFile,但是ZipInputStream 在取得每一個ZipEntry 的時候,不需要每一個ZipEntry 的時候,不需要每一個ZipEntry 的名稱。
- 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() ;
- }
- };
總結:
1、壓縮文件中的每一個壓縮實體都使用ZipEntry 保存,一個壓縮文件中可能包含一個或多個的ZipEntry 對象。
2、在JAVA中可以進行zip、jar、gz、三種格式的壓縮支持,操作流程基本上是一樣的
3、ZipOutputStream 可以進行壓縮輸出,但是輸出的位置不一定是文件。
4、ZipFile 表示每一個壓縮文件,可以得到每一個壓縮實體的輸入流
5、ZipInputStream 可以得到每一個實體,但是卻無法得到每一個實體的輸入流。