Java压缩和解压缩

在Java中,压缩和解压缩是常见的文件操作。压缩可以将大型文件或文件夹转换为更小的压缩文件,以节省存储空间和传输时间。解压缩则是将压缩文件恢复成原始文件或文件夹。Java提供了一些内置类和方法来处理压缩和解压缩操作,使我们能够轻松实现这些功能。本文将介绍Java中如何进行压缩和解压缩,并提供相应的代码示例。

1. 压缩文件

Java的压缩功能通过java.util.zip包中的ZipOutputStream类实现。ZipOutputStream类提供了将文件或目录压缩成ZIP格式文件的方法。下面是一个示例代码,演示了如何压缩单个文件:

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

public class FileCompressor {

    public static void compressFile(String sourceFilePath, String zipFilePath) {
        try {
            File sourceFile = new File(sourceFilePath);
            FileOutputStream fos = new FileOutputStream(zipFilePath);
            ZipOutputStream zipOut = new ZipOutputStream(fos);
            FileInputStream fis = new FileInputStream(sourceFile);

            ZipEntry zipEntry = new ZipEntry(sourceFile.getName());
            zipOut.putNextEntry(zipEntry);

            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }

            fis.close();
            zipOut.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String sourceFilePath = "path/to/source/file.txt";
        String zipFilePath = "path/to/destination/file.zip";
        compressFile(sourceFilePath, zipFilePath);
    }
}

在上面的示例中,compressFile方法接受源文件路径和目标ZIP文件路径作为参数。它通过创建FileInputStreamFileOutputStream来读取源文件并写入ZIP文件。ZipEntry用于设置ZIP文件中的条目,然后使用zipOut.putNextEntry将条目添加到ZIP文件中。

可以使用上面的示例代码通过调用compressFile方法来压缩文件。将源文件路径和目标ZIP文件路径替换为实际路径,然后运行程序即可。

2. 压缩文件夹

如果要压缩整个文件夹,可以使用递归方法来遍历文件夹中的所有文件和子文件夹。下面是一个示例代码,演示了如何压缩整个文件夹:

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

public class FolderCompressor {

    public static void compressFolder(String sourceFolderPath, String zipFilePath) {
        try {
            FileOutputStream fos = new FileOutputStream(zipFilePath);
            ZipOutputStream zipOut = new ZipOutputStream(fos);
            File sourceFolder = new File(sourceFolderPath);

            compress(sourceFolder, sourceFolder.getName(), zipOut);

            zipOut.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void compress(File fileToCompress, String fileName, ZipOutputStream zipOut) throws IOException {
        if (fileToCompress.isDirectory()) {
            File[] files = fileToCompress.listFiles();
            if (files != null) {
                for (File file : files) {
                    compress(file, fileName + "/" + file.getName(), zipOut);
                }
            }
        } else {
            FileInputStream fis = new FileInputStream(fileToCompress);
            ZipEntry zipEntry = new ZipEntry(fileName);
            zipOut.putNextEntry(zipEntry);

            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }

            fis.close();
        }
    }

    public static void main(String[] args) {
        String sourceFolderPath = "path/to/source/folder";
        String zipFilePath = "path/to/destination/folder.zip";
        compressFolder(sourceFolderPath, zipFilePath);
    }
}

在上面的示例中,compressFolder方法接受源文件夹路径和目标ZIP文件路径作为参数。它使用递归方法compress来遍历文件夹中的所有文件和子文件夹,并将它们压缩到ZIP文件中。

可以使用上面的示例代码通过调用compressFolder方法来压缩文件夹。将源文件夹路径和目标ZIP