java如何压缩文件
使用 java.util.zip 进行文件压缩
Java 提供了 java.util.zip 包用于文件压缩和解压缩操作。以下是一个简单的示例,展示如何将一个文件压缩为 ZIP 格式:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileExample {
public static void zipFile(String sourceFilePath, String zipFilePath) throws IOException {
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zipOut = new ZipOutputStream(fos);
FileInputStream fis = new FileInputStream(sourceFilePath);
ZipEntry zipEntry = new ZipEntry(new File(sourceFilePath).getName());
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.close();
fis.close();
fos.close();
}
}
压缩多个文件或目录
如果需要压缩多个文件或整个目录,可以使用递归方法遍历目录结构:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipDirectoryExample {
public static void zipDirectory(String sourceDirPath, String zipFilePath) throws IOException {
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zipOut = new ZipOutputStream(fos);
File fileToZip = new File(sourceDirPath);
zipFile(fileToZip, fileToZip.getName(), zipOut);
zipOut.close();
fos.close();
}
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
if (fileToZip.isHidden()) {
return;
}
if (fileToZip.isDirectory()) {
File[] children = fileToZip.listFiles();
for (File childFile : children) {
zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
}
return;
}
FileInputStream fis = new FileInputStream(fileToZip);
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();
}
}
使用 Apache Commons Compress 库
如果需要更灵活的压缩功能(如支持多种压缩格式),可以使用 Apache Commons Compress 库:
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CommonsCompressExample {
public static void zipWithCommonsCompress(String sourcePath, String targetPath) throws IOException {
try (ZipArchiveOutputStream archive = new ZipArchiveOutputStream(new FileOutputStream(targetPath))) {
File file = new File(sourcePath);
addFileToArchive(archive, file, "");
}
}
private static void addFileToArchive(ZipArchiveOutputStream archive, File file, String base) throws IOException {
String entryName = base + file.getName();
ZipArchiveEntry entry = new ZipArchiveEntry(file, entryName);
archive.putArchiveEntry(entry);
if (file.isFile()) {
try (FileInputStream fis = new FileInputStream(file)) {
IOUtils.copy(fis, archive);
}
archive.closeArchiveEntry();
} else {
archive.closeArchiveEntry();
File[] children = file.listFiles();
if (children != null) {
for (File child : children) {
addFileToArchive(archive, child, entryName + "/");
}
}
}
}
}
注意事项
- 处理大文件时,应使用缓冲区(如示例中的
byte[1024])以提高性能。 - 确保在操作完成后关闭所有流,防止资源泄漏。
- 对于中文文件名,可能需要额外处理编码问题。
- 压缩操作可能会抛出
IOException,应适当处理异常。







