Java 文件/文件夾壓縮

使用java.util.zip包實現文件壓縮

ZipOutputStream
  • public ZipOutputStream(OutputStream out) 構造函數,創建zip輸出流
  • public void putNextEntry(ZipEntry e) 設置每一個ZipEntry對象,即設置壓縮元素名稱(文件名)
  • public void setComment(String comment) 設置文件註釋
  • public void write(byte b[]) 寫入zip文件內容
Example 1 壓縮單文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author: dkangel
 * @since: 2019/11/21 21:04
 * @Description: 壓縮單個文件
 */
public class ZipSingleFile {
    public static void main(String[] args) throws Exception {
        // 原始文件
        String sourcePath = "D:/zip_test/test.txt";
        File sourceFile = new File(sourcePath);
        // zip文件名(包含文件路徑)
        String targetPath = "D:/zip_test/test.zip";
        File targetFile = new File(targetPath);
        // 原始文件數據讀入流
        InputStream input = new FileInputStream(sourceFile);
        // zip文件輸出流
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(targetFile));
        // 定義壓縮文件內容文件名
        String contentFileName = "content.docx";
        zipOut.putNextEntry(new ZipEntry(contentFileName));
        zipOut.setComment("hello world.");
        // 寫入數據
        int temp;
        while ((temp = input.read()) != -1) {
            zipOut.write(temp);
        }
        input.close();
        zipOut.close();
    }
}

測試結果:
壓縮前:
在這裏插入圖片描述
壓縮後:
在這裏插入圖片描述
結論:壓縮單文件成功,壓縮後文件內容不變,可以自定義zip文件名、內容文件名等。

Example 2 壓縮文件夾(多文件壓縮)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author: dkangel
 * @since: 2019/11/21 21:32
 * @Description:
 */
public class ZipMultipleFile {

    public static void main(String[] args) throws IOException {
        // 需要壓縮文件夾路徑
        String sourcePath = "D:/zip_test/tmp";
        File sourceFile = new File(sourcePath);
        // zip文件輸出路徑
        String targetPath = "D:/zip_test/zip_test.zip";
        File targetFile = new File(targetPath);
        // 定義zip輸出流,用於將輸入流內容寫入zip文件
        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(targetFile));
        // 壓縮文件
        zipFile(sourceFile, zipOut);
        zipOut.close();
    }

    /**
     * 壓縮文件
     *
     * @param sourceFile      原始文件
     * @param zipOutputStream 壓縮流
     * @throws IOException
     */
    private static void zipFile(File sourceFile, ZipOutputStream zipOutputStream) throws IOException {
        // 文件夾,則遞歸遍歷
        if (sourceFile.isDirectory()) {
            File[] files = sourceFile.listFiles();
            if (files == null) {
                return;
            }
            for (File subFile : files) {
                zipFile(subFile, zipOutputStream);
            }
        }
        // 文件,寫入文件
        if (sourceFile.isFile()) {
            // 獲取父路徑
            String regx = "tmp";
            int index = sourceFile.getPath().indexOf(regx);
            String fileName = sourceFile.getPath().substring(index + regx.length() + 1);
            zipOutputStream.putNextEntry(new ZipEntry(fileName));
            // 寫入數據
            int temp;
            InputStream inputStream = new FileInputStream(sourceFile);
            while ((temp = inputStream.read()) != -1) {
                zipOutputStream.write(temp);
            }
            inputStream.close();
        }
    }
}

測試結果:
壓縮前:
在這裏插入圖片描述
壓縮後:
在這裏插入圖片描述
結論:文件夾壓縮成功,壓縮後文件內容不變,可以自定義zip文件名、內容文件名等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章