Java实现文件夹压缩的3种简单方法详解

这是文章《Java压缩文件夹示例》的第1部分(共1部分)。

内容片段:今天我们将研究Java压缩文件的例子。我们还将使用Java程序压缩文件夹并创建zip文件。

Java压缩文件

java.util.zip.ZipOutputStream可以用于将文件压缩成ZIP格式。由于zip文件可以包含多个条目,ZipOutputStream使用java.util.zip.ZipEntry来表示zip文件条目。

Java的ZIP文件

创建一个包含单个文件的zip压缩包非常简单,我们需要从目标文件的FileOutputStream对象创建一个ZipOutputStream对象。然后,我们向ZipOutputStream添加一个新的ZipEntry,并使用FileInputStream从源文件读取到ZipOutputStream对象中。写入完成后,我们需要关闭ZipEntry并释放所有资源。

Java压缩文件夹

压缩一个文件夹有点复杂,首先我们需要获取文件列表的绝对路径。然后分别处理每个文件。我们需要为每个文件添加一个ZipEntry,并使用FileInputStream将源文件的内容读取到相应的ZipEntry中。

Java压缩文件示例

这是一个展示如何在Java中压缩单个文件或文件夹的Java程序。

package com.Olivia.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<String> filesListInDir = new ArrayList<String>();

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

    /**
     * 此方法用于压缩目录
     * @param dir 要压缩的目录
     * @param zipDirName 生成的zip文件名
     */
    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("正在压缩 " + 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();
        }
    }
    
    /**
     * 此方法将目录中的所有文件添加到列表中
     * @param dir 要处理的目录
     * @throws IOException 可能抛出的IO异常
     */
    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);
        }
    }

    /**
     * 此方法将单个文件压缩为zip格式
     * @param file 要压缩的文件
     * @param zipFileName 生成的zip文件名
     */
    private static void zipSingleFile(File file, String zipFileName) {
        try {
            // 创建ZipOutputStream来写入zip文件
            FileOutputStream fos = new FileOutputStream(zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            // 向ZipOutputStream添加一个新的Zip条目
            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条目以写入zip文件
            zos.closeEntry();
            // 关闭资源
            zos.close();
            fis.close();
            fos.close();
            System.out.println(file.getCanonicalPath() + " 已压缩到 " + zipFileName);
            
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

以上Java压缩示例程序的输出结果是:

/Users/scdev/sitemap.xml 已压缩到 /Users/scdev/sitemap.zip
正在压缩 /Users/scdev/tmp/.DS_Store
正在压缩 /Users/scdev/tmp/data/data.dat
正在压缩 /Users/scdev/tmp/data/data.xml
正在压缩 /Users/scdev/tmp/data/xmls/project.xml
正在压缩 /Users/scdev/tmp/data/xmls/web.xml
正在压缩 /Users/scdev/tmp/data.Xml
正在压缩 /Users/scdev/tmp/DB.xml
正在压缩 /Users/scdev/tmp/item.XML
正在压缩 /Users/scdev/tmp/item.xsd
正在压缩 /Users/scdev/tmp/ms/data.txt
正在压缩 /Users/scdev/tmp/ms/project.doc

注意,在将文件记录到目录中的zip文件时,我打印的是绝对路径。但是在添加zip条目时,我使用的是相对于目录的路径,这样在解压时就会创建相同的目录结构。这就是Java zip示例的全部内容。

bannerAds