/*本實例采用遞歸的方法,把指定的目錄(包括子目錄)壓縮成一個Zip文件。
原理是:為指定目錄的所有文件創建一個ZipEntry(壓縮流入口),然后把文件寫進去;當碰到子目錄時,調用遞歸函數,把它壓縮成另一個zip文件,當作一般文件寫進去.
//使用方法 java Zip <目錄名>
//java.util.zip包提供了數據壓縮和解壓縮的類
import java.io.*;
import java.util.zip.*;
public class Zip{
static final int BUFFER=2048;
static boolean flag=false;
public static void main(String args[])throws IOException{
File file=new File(args[0]);
FileInputStream file1=new FileInputStream(ZipSubDirectory(file));
}
//ZipSubdirectory函數將一個指定目錄(包括它子目錄)壓縮成一個同名壓縮文件(這里稱為"ORIGIN")
public static File ZipSubdirectory(File myDir)throws IOException{
//創建緩沖輸入流BufferedInputStream
BufferedInputStream origin=null;
//創建ZipOutputStream對象,將向它傳遞希望寫入文件的輸出流
File zipFile=new File(myDir.getName()+".zip");
FileOutputStream fos=new FileOutputStream(zipFile);
ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(fos,BUFFER));
//dirContents[]獲取當前目錄(myDir)所有文件對象(包括子目錄名)
File dirContents[]=myDir.listFiles();
//創建臨時文件tempFile,使用后刪除
File tempFile=null;
try{
//處理當前目錄所有文件對象,包括子目錄
for(int i=0;i
//使用遞歸方法將當前目錄的子目錄轉成一個ZIP文件,并作為一個ENTRY加進"ORIGIN"
if(dirContents[i].isDirectory()){
tempFile=ZipSubdirectory(dirContents[i]);
flag=true;
}
//假如當前文件不是子目錄
else{
tempFile=dirContents[i];
//flag標記tempFile是否由子目錄壓縮成的ZIP文件
flag=false;
}
System.out.FileInputStream fis=new FileInputStream(tempFile);
origin=new BufferedInputStream(fis,BUFFER);
//為被讀取的文件創建壓縮條目
ZipEntry entry=new ZipEntry(tempFile.getName());
byte data[]=new byte[BUFFER];
int count;
//在向ZIP輸出流寫入數據之前,必須首先使用out.putNextEntry(entry); 方法安置壓縮條目對象
out.putNextEntry(entry);
//向ZIP 文件寫入數據
while((count=origin.read(data,0,BUFFER))!=-1){
out.write(data,0,count);
}
//tempFile是臨時生成的ZIP文件,刪除它
if(flag==true){
flag=tempFile.delete();
System.out.println("Delete file:"+tempFile.getName()+flag);
}
//關閉輸入流
origin.close();
}
out.close();
}catch(Exception e){System.out.println(e);
}
//遞歸返回
return zipFile;
}
)
新聞熱點
疑難解答