📜  Java中文件的压缩和解压(1)

📅  最后修改于: 2023-12-03 15:31:49.490000             🧑  作者: Mango

Java中文件的压缩和解压

在Java中,可以使用ZipOutputStream和ZipInputStream类来进行文件的压缩和解压。

文件压缩

要对文件进行压缩,首先需要创建ZipOutputStream对象并指定要压缩的文件路径。接下来,通过putNextEntry方法添加需要压缩的文件,并使用write方法将文件写入压缩文件中。最后,使用close方法关闭ZipOutputStream对象。

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FileCompressor {

    public static void compress(String filePath) throws Exception {
        ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(filePath + ".zip"));
        File fileToZip = new File(filePath);

        zipFile(fileToZip, fileToZip.getName(), zip);
        zip.close();
    }

    private static void zipFile(File file, String fileName, ZipOutputStream zip) throws Exception {
        if (file.isHidden()) {
            return;
        }
        if (file.isDirectory()) {
            File[] children = file.listFiles();
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zip);
            }
            return;
        }

        FileInputStream fis = new FileInputStream(file);
        ZipEntry zipEntry = new ZipEntry(fileName);
        zip.putNextEntry(zipEntry);

        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0) {
            zip.write(bytes, 0, length);
        }
        fis.close();
    }
}
文件解压

要对已压缩的文件进行解压,首先需要创建ZipInputStream对象并指定需要解压的文件路径。接下来,使用getNextEntry方法获取压缩文件中的文件,并将其解压到指定路径下。最后,使用close方法关闭ZipInputStream对象。

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class FileDecompressor {

    public static void decompress(String filePath) throws Exception {
        File dir = new File(filePath.substring(0, filePath.lastIndexOf('.')));
        if (!dir.exists()) {
            dir.mkdirs();
        }

        FileInputStream fis = new FileInputStream(filePath);
        ZipInputStream zip = new ZipInputStream(fis);

        ZipEntry entry = zip.getNextEntry();
        while (entry != null) {
            String fileName = entry.getName();
            File file = new File(dir + "/" + fileName);
            if (entry.isDirectory()) {
                file.mkdirs();
            } else {
                FileOutputStream fos = new FileOutputStream(file);
                byte[] bytes = new byte[1024];
                int length;
                while ((length = zip.read(bytes)) >= 0) {
                    fos.write(bytes, 0, length);
                }
                fos.close();
            }
            zip.closeEntry();
            entry = zip.getNextEntry();
        }

    }
}
使用示例

下面是一个使用示例,先将指定路径下的文件压缩为zip文件,再将zip文件解压到指定路径下。

public class Demo {

    public static void main(String[] args) throws Exception {
        String filePath = "C:/tmp/test";
        FileCompressor.compress(filePath);

        String zipFilePath = filePath + ".zip";
        FileDecompressor.decompress(zipFilePath);
    }
}