Java文件的壓縮與解壓縮

Java文件的壓縮與解壓縮

文件的壓縮與解壓縮使我們平時經常會碰到的問題,Java對文件的壓縮與解壓縮支持的也非常好,主要用到的類有:

1、ZipInputStream:此類爲讀取 ZIP 文件格式的文件實現輸入流過濾器。

2、ZipOutputStream:此類爲以 ZIP 文件格式寫入文件實現輸出流過濾器。

3、ZipEntry:此類用於表示 ZIP 文件條目。

4、ZipFile:此類用於從 ZIP 文件讀取條目。

下面就用兩個具體的實例來展現文件的壓縮與解壓縮的操作步驟。

文件的壓縮:

將文件壓縮成zip格式的文件包,包括目錄,具體包括以下步驟:
(1)、用壓縮後文件名創建輸出流

ZipOutputStream zout=new ZipOutputStream(new FileOutputStream(zipFileName));
BufferedOutputStream bufout=new BufferedOutputStream(zout);

(2)、檢查被壓縮文件是目錄還是文件
如果是文件:
a、創建Zip壓縮進入點:

zout.putNextEntry(new ZipEntry(“被壓縮文件名”)); 

b、用被壓縮文件名創建輸入流

FileInputStream fin=new FileInputStream(f);
BufferedInputStream bufin=new BufferedInputStream(fin);

c、然後循環地從輸入流讀取內容,寫入到輸出流。

(3)、在適當的位置關閉所有流

下面請看示例代碼:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


/*
 * 功能:實現文件或文件夾的壓縮。
 */
public class ZipCompressing {

    private int k=1;  // 定義遞歸次數變量

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ZipCompressing book=new ZipCompressing();
        try{
            book.zip("E:\\娛樂\\JavaTest.zip", new File("E:\\娛樂\\JavaTest"));
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    private void zip(String zipFileName,File inputFile) throws IOException{
        System.out.println("壓縮中...");
        ZipOutputStream zout=new ZipOutputStream(new FileOutputStream(zipFileName));
        BufferedOutputStream bufout=new BufferedOutputStream(zout);
        zip(zout, inputFile,inputFile.getName(),bufout);
        bufout.close();
        zout.close();
        System.out.println("壓縮完成");
    }

    private void zip(ZipOutputStream zout, File f, String base, BufferedOutputStream bufout) throws IOException {
        // TODO Auto-generated method stub
        if(f.isDirectory()){
            File[] f1=f.listFiles();
            if(f1.length==0){
                zout.putNextEntry(new ZipEntry(base+"/"));     // 創建Zip進入點base
                System.out.println(base+"/");
            }
            for(int i=0;i<f1.length;i++){
                zip(zout, f1[i],base+"/"+f1[i].getName(),bufout);  // 遞歸遍歷子文件
            }
            System.out.println("第"+k+"次遞歸");
            k++;
        }else {
            zout.putNextEntry(new ZipEntry(base));    // 創建Zip壓縮進入點base
            System.out.println(base);
            FileInputStream fin=new FileInputStream(f);
            BufferedInputStream bufin=new BufferedInputStream(fin);
            int b;
            while((b=bufin.read())!=-1){
                bufout.write(b);                      // 將字節流寫入當前Zip目錄
            }
            bufin.close();
            fin.close();
        }       
    }
}

文件的解壓縮:

文件的解壓縮過程就是從壓縮文件中讀取內容,然後按照壓縮文件的組織結構寫入到目的文件中。下面介紹具體操作步驟:

(1)、用被解壓的Zip文件名創建輸入流:

ZipInputStream zin=new ZipInputStream(new FileInputStream(dirFileName)); 
BufferedInputStream bufin=new BufferedInputStream(zin);

(2)、循環訪問輸入流,依次處理每一個條目:檢查當前條目是否爲爲文件
如果爲文件:
a、檢查輸出的目的文件是否存在,如果不存在則創建目錄:

File fout=new File(parent,entry.getName());
(new File(fout.getParent())).mkdirs();

b、用輸出的目的文件名創建輸出流

FileOutputStream out=new FileOutputStream(fOut);
BufferedOutputStream bufout=new BufferedOutputStream(out);

c、循環地進行讀與寫。

(3)、在適當的位置關閉流。

下面請看示例代碼:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/*
 * 程序實現了ZIP解壓[decompression]
 * 
 */
public class ZipDecrompressing {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long startTime=System.currentTimeMillis();
        File parent=new File("E:\\娛樂\\JavaTest1");     // 輸出路徑(文件夾目錄)
        String dirFileName="E:\\娛樂\\JavaTest.zip";    // 輸入源Zip路徑
        try {
            // 讀

            ZipInputStream zin=new ZipInputStream(new FileInputStream(dirFileName));    // 輸入源Zip路徑
            BufferedInputStream bufin=new BufferedInputStream(zin);
            File fOut=null;
            ZipEntry entry=null;

            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 bufout=new BufferedOutputStream(out);
                    int b;
                    while((b=bufin.read())!=-1){
                        bufout.write(b);
                    }
                    bufout.close();
                    out.close();
                    System.out.println(fOut+"解壓成功");
                }
            } catch (Exception e1) {
                e1.printStackTrace();
            }finally {
                bufin.close();
                zin.close();
            }
        }catch(Exception  e){
            e.printStackTrace();
        }
        long endTime=System.currentTimeMillis();
        System.out.println("耗費時間:  "+(endTime-startTime)+" ms");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章