Java 壓縮文件夾示例

今天我們將研究Java壓縮檔案的範例。我們還將使用Java程式壓縮資料夾並創建壓縮檔案。

Java ZIP

java.util.zip.ZipOutputStream可以用來將檔案壓縮成ZIP格式。由於ZIP檔案可以包含多個條目,ZipOutputStream使用java.util.zip.ZipEntry來表示ZIP檔案條目。

Java ZIP 檔案

創建單個檔案的ZIP壓縮檔案非常簡單,我們需要從目標檔案的FileOutputStream物件創建一個ZipOutputStream物件。然後,我們將一個新的ZipEntry添加到ZipOutputStream中,並使用FileInputStream從源檔案讀取到ZipOutputStream物件中。寫入完成後,我們需要關閉ZipEntry並釋放所有資源。

Java Zip 資料夾

壓縮目錄有點複雜,首先我們需要獲取文件列表的絕對路徑。然後分別處理每個文件。我們需要為每個文件添加一個ZipEntry,並使用FileInputStream來讀取源文件的內容,並將其寫入對應的ZipEntry。

Java壓縮示例

這是一個Java程序示例,展示了如何在Java中壓縮單個文件或文件夾。

package com.journaldev.files;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFiles {
    
    List filesListInDir = new ArrayList();

    public static void main(String[] args) {
        File file = new File("/Users/pankaj/sitemap.xml");
        String zipFileName = "/Users/pankaj/sitemap.zip";
        
        File dir = new File("/Users/pankaj/tmp");
        String zipDirName = "/Users/pankaj/tmp.zip";
        
        zipSingleFile(file, zipFileName);
        
        ZipFiles zipFiles = new ZipFiles();
        zipFiles.zipDirectory(dir, zipDirName);
    }

    /**
     * This method zips the directory
     * @param dir
     * @param zipDirName
     */
    private void zipDirectory(File dir, String zipDirName) {
        try {
            populateFilesList(dir);
            //現在逐個壓縮文件
            //創建ZipOutputStream來寫入zip文件
            FileOutputStream fos = new FileOutputStream(zipDirName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            for(String filePath : filesListInDir){
                System.out.println("Zipping "+filePath);
                //對於ZipEntry,我們需要保留相對文件路徑,因此我們在絕對路徑上使用了substring
                ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
                zos.putNextEntry(ze);
                //讀取文件並寫入ZipOutputStream
                FileInputStream fis = new FileInputStream(filePath);
                byte[] buffer = new byte[1024];
                int len;
                while ((len = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, len);
                }
                zos.closeEntry();
                fis.close();
            }
            zos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * This method populates all the files in a directory to a List
     * @param dir
     * @throws IOException
     */
    private void populateFilesList(File dir) throws IOException {
        File[] files = dir.listFiles();
        for(File file : files){
            if(file.isFile()) filesListInDir.add(file.getAbsolutePath());
            else populateFilesList(file);
        }
    }

    /**
     * This method compresses the single file to zip format
     * @param file
     * @param zipFileName
     */
    private static void zipSingleFile(File file, String zipFileName) {
        try {
            //創建ZipOutputStream來寫入zip文件
            FileOutputStream fos = new FileOutputStream(zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            //向ZipOutputStream添加新的Zip Entry
            ZipEntry ze = new ZipEntry(file.getName());
            zos.putNextEntry(ze);
            //讀取文件並寫入ZipOutputStream
            FileInputStream fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            
            //關閉zip entry以寫入zip文件
            zos.closeEntry();
            //關閉資源
            zos.close();
            fis.close();
            fos.close();
            System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
            
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

上述Java壓縮示例程序的輸出是:

/Users/pankaj/sitemap.xml is zipped to /Users/pankaj/sitemap.zip
Zipping /Users/pankaj/tmp/.DS_Store
Zipping /Users/pankaj/tmp/data/data.dat
Zipping /Users/pankaj/tmp/data/data.xml
Zipping /Users/pankaj/tmp/data/xmls/project.xml
Zipping /Users/pankaj/tmp/data/xmls/web.xml
Zipping /Users/pankaj/tmp/data.Xml
Zipping /Users/pankaj/tmp/DB.xml
Zipping /Users/pankaj/tmp/item.XML
Zipping /Users/pankaj/tmp/item.xsd
Zipping /Users/pankaj/tmp/ms/data.txt
Zipping /Users/pankaj/tmp/ms/project.doc

請注意,在將文件記錄到目錄zip時,我正在打印絕對路徑。但在添加zip條目時,我使用的是從目錄中的相對路徑,這樣當我們解壓縮時,它將創建相同的目錄結構。這就是Java壓縮示例的全部。

Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example