利用Java壓縮指定文件夾爲zip 【vaynexiao】

import java.io.*;
import java.nio.channels.FileChannel;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Test01 {

    //需求:將C:\idea_pro壓縮zip文件
    //實驗證明:在c盤根目錄牽扯權限問題,無法實現,
    // 另外,切記不可以將生成的zip放進要壓縮的文件夾,否則文件夾一直在變,程序死循環,最終內存溢出
    public static void main(String[] args) throws IOException {
        String targetPath = "C:\\software\\idea_pro.zip";
        compreSsion(targetPath, new File("C:\\idea_pro"));

        //3種獲取文件大小的方法
		//1,使用File的length方法
        System.out.println(new File(targetPath).length()+"字節");

		//2,通過FileInputStream獲取文件大小
        File f = new File(targetPath);
        FileInputStream fis = new FileInputStream(f);
        System.out.println(fis.available()+"字節"); 
        //特別注意這裏,available返回的是int,如果文件大小字節數超過了Integer.MAX_VALUE,會得到錯誤結果

        File f2 = new File(targetPath);//3,FileChannel
        FileInputStream fis2 = new FileInputStream(f2);
        FileChannel fc = fis2.getChannel();
        System.out.println(fc.size()+"字節");
    }

    private static void compreSsion (String zipFileName, File target) throws IOException {
        System.out.println("開始壓縮文件,將:"+target.getName()+",壓縮爲:"+zipFileName);
        long start = System.currentTimeMillis();
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
        BufferedOutputStream bos = new BufferedOutputStream(out);
        zip(out, target, target.getName(), bos);
        bos.close();;
        out.close();
        long end = System.currentTimeMillis();
        System.out.println("壓縮完成,耗時:"+(end-start)+"毫秒,即大約"+(end-start)/1000+"秒");
    }

    private static void zip (ZipOutputStream zout, File target, String name, BufferedOutputStream bos) throws IOException{
        //判斷是不是目錄
        if (target.isDirectory()) {
            File[] files = target.listFiles();
            if (files.length == 0 ) { //空目錄
                zout.putNextEntry(new ZipEntry(name+"/"));
            }
            /**
             * 開始編寫新的zip文件條目,並將流定位到條目數據的開頭
             * 關閉當前條目,如果仍然有效。如果沒有爲條目數據指定壓縮方法,將使用默認壓縮方法,
             * 如果條目沒有設置修改時間,將使用當前時間
             */
            for (File f : files ) {
                //遞歸處理
                zip(zout, f, name+"/"+f.getName(), bos);
            }
        } else {
            zout.putNextEntry(new ZipEntry(name));
            InputStream inputStream = new FileInputStream(target);
            BufferedInputStream bis = new BufferedInputStream(inputStream);
            byte[] bytes = new byte[1024]; //一次讀取1k
            int len = -1;
            while ( (len = bis.read(bytes))!= -1 ) {
                bos.write(bytes, 0, len);
            }
            bis.close();
        }
    }

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