目錄
- java處理檔案壓縮的類
- ZipOutStream壓縮檔案
- 1.putNextEntry(new ZipEntry(""))
- 2.write()
java處理檔案壓縮的類
java中常用ZipOutStream進行檔案的壓縮,用ZipInputStream對檔案進行解壓,zip相對于其他的檔案的io稍有一點點不同的就是:它的内部就是一個小型的檔案系統。如果是一個檔案夾所有檔案都是文檔二不是檔案夾。那還好辦直接操作。如果涉及到檔案夾和文檔的不固定分布。那就需要仔細考慮下。這裡用遞歸進行周遊。
ZipOutStream壓縮檔案
主要兩個方法:
1.putNextEntry(new ZipEntry(""))
這裡面重要的就是ZipEntry這個概念首先要懂。ZipEntry是zip下面的檔案條目,你可以比作外面系統的File類似。後面的參數就是在zip目錄下的相對位置。是以這裡有一點比較重要的就是當你周遊檔案夾的時候你的ZipEntry的參數的改變規律。寫不好的話會使整個檔案目錄混亂(如果檔案層級較低那就不礙事)。而putNextEntry(ZipEntry z)的意思就是我下面io操作(寫入)都是在z這個檔案條目下進行的。
2.write()
這個zipoutputstream流和其他的output流不一樣的地方就是BufferedOutputStream不能嵌套它。也就是它不能套緩存流用。
對于檔案夾下包含檔案夾需要特殊考慮。判斷它是不是檔案夾。檔案夾的話要周遊他的子節點檔案。用遞歸思想。已在代碼中給出注釋。還有檔案要注意相對絕對路徑。
貼上我的模闆代碼:
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()+"/");
}
else {
dozip(zipout, f[i], addpath+f[i].getName());
}
}
}
else
{
InputStream input;
BufferedInputStream buff;
zipout.putNextEntry(new ZipEntry(addpath));
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());
}
}
}
- 如果對
等感性趣歡迎關注我的個人公衆号交流:後端、爬蟲、資料結構算法
bigsai