java使用ZipOutputStream對文件進行壓縮

java處理文件壓縮的類

java中經常使用ZipOutStream進行文件的壓縮,用ZipInputStream對文件進行解壓,zip相對於其餘的文件的io稍有一點點不一樣的就是:它的內部就是一個小型的文件系統。若是是一個文件夾全部文件都是文檔二不是文件夾。那還好辦直接操做。若是涉及到文件夾和文檔的不固定分佈。那就須要仔細考慮下。這裏用遞歸進行遍歷。java

ZipOutStream壓縮文件

主要兩個方法:緩存

1.putNextEntry(new ZipEntry(""))

這裏面重要的就是ZipEntry這個概念首先要懂。ZipEntry是zip下面的文件條目,你能夠比做外面系統的File相似。後面的參數就是在zip目錄下的相對位置。因此這裏有一點比較重要的就是當你遍歷文件夾的時候你的ZipEntry的參數的改變規律。寫很差的話會使整個文件目錄混亂(若是文件層級較低那就不礙事)。而putNextEntry(ZipEntry z)的意思就是我下面io操做(寫入)都是在z這個文件條目下進行的。函數

2.write()

這個zipoutputstream流和其餘的output流不同的地方就是BufferedOutputStream不能嵌套它。也就是它不能套緩存流用。spa

對於文件夾下包含文件夾須要特殊考慮。判斷它是否是文件夾。文件夾的話要遍歷他的子節點文件。用遞歸思想。已在代碼中給出註釋。還有文件要注意相對絕對路徑。code

貼上個人模板代碼:cdn

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

public class test1 {

	public static void main(String[] args) throws IOException {
		String filepath="F:\\fileget\\二班";//目標文件夾
		String zipname="F:\\fileget\\二班軟工做業.zip";//目標輸出路徑
		filetozip(filepath,zipname);
	}
	public static void filetozip(String filepath,String zipname) throws IOException {
		File file=new File(filepath);
		OutputStream outputStream=new FileOutputStream(zipname);
		ZipOutputStream zipout=new ZipOutputStream(outputStream);	
		//遞歸函數 三個參數分別表明 1:當前zipout流 2:當前文件/文件夾 3:在zip下的path
		dozip(zipout,file,""); 
		zipout.finish();
		zipout.close();
		outputStream.close();
	}
	private static void dozip(ZipOutputStream zipout, File file, String addpath) throws IOException {
		if(file.isDirectory())//若是是個文件夾
		{
			File f[]=file.listFiles();
			for(int i=0;i<f.length;i++)
			{
			//若是是個文件夾 後面要加「/」由於它會遍歷下層
				if(f[i].isDirectory()) {
				dozip(zipout, f[i], addpath+f[i].getName()+"/");
				}//若是是文件,執行dozip下一次判斷它不是文件夾就會進行壓縮
				else {
					dozip(zipout, f[i], addpath+f[i].getName());
				}			
			}
		}
		else//不是文件夾,是文件
		{
			InputStream input;
			BufferedInputStream buff;
			//初始爲"",意味不找下級就是("xxx.doc"),若是不是頂級目錄層就("xx/yy/x.doc")
			zipout.putNextEntry(new ZipEntry(addpath+file.getName()));
			input=new FileInputStream(file);
			buff=new BufferedInputStream(input);
			 byte b[]=new byte[1024*5];
			 int a=0;
			 while((a=buff.read(b))!=-1)
			 {
				 zipout.write(b);
			 }
			 buff.close();
			 input.close();
			System.out.println(file.getName());
		}
		
	}
}
複製代碼

在這裏插入圖片描述
在這裏插入圖片描述
另外,解壓的那個類後面有時間會補充下來。
相關文章
相關標籤/搜索