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();
}
}
}
利用Java壓縮指定文件夾爲zip 【vaynexiao】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.