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");
}
}