天天看點

java使用ZipOutputStream對檔案進行壓縮

目錄

  • ​​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());
        }

    }
    
  }      
java使用ZipOutputStream對檔案進行壓縮
java使用ZipOutputStream對檔案進行壓縮
  • 如果對​

    ​後端、爬蟲、資料結構算法​

    ​​等感性趣歡迎關注我的個人公衆号交流:​

    ​bigsai​