在 Java 中,你可以使用不同的方式来压缩文件。下面我会介绍两种常见的压缩文件的方式:使用 Java 标准库以及使用第三方库 Apache Commons Compress。
Java 标准库提供了 java.util.zip
包,可以用来进行文件压缩和解压操作。
ZipOutputStream
,将输出流包装起来,用于写入压缩文件的条目。ZipEntry
来表示压缩文件的条目,并将其添加到 ZipOutputStream
中。ZipOutputStream
,完成条目的添加。ZipOutputStream
来完成压缩文件的创建。import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) {
String sourceFolderPath = "path/to/source/folder";
String zipFilePath = "path/to/output/archive.zip";
try {
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zipOut = new ZipOutputStream(fos);
File sourceFolder = new File(sourceFolderPath);
zipFolder(sourceFolder, sourceFolder.getName(), zipOut);
zipOut.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void zipFolder(File folder, String parentFolder, ZipOutputStream zipOut) throws IOException {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
zipFolder(file, parentFolder + "/" + file.getName(), zipOut);
} else {
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(parentFolder + "/" + file.getName());
zipOut.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zipOut.write(buffer, 0, length);
}
zipOut.closeEntry();
fis.close();
}
}
}
}
Apache Commons Compress 是一个流行的第三方库,提供了更多的压缩格式和选项。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version> <!-- 使用最新版本 -->
</dependency>
implementation 'org.apache.commons:commons-compress:1.21' // 使用最新版本
ArchiveStreamFactory
创建一个压缩流,例如 ZipArchiveOutputStream
。ArchiveEntry
来表示压缩文件的条目,并将其添加到压缩流中。import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils;
import java.io.*;
public class CommonsCompressExample {
public static void main(String[] args) {
String sourceFolderPath = "path/to/source/folder";
String zipFilePath = "path/to/output/archive.zip";
try {
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream)
new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, fos);
File sourceFolder = new File(sourceFolderPath);
zipFolder(sourceFolder, "", zipOut);
zipOut.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void zipFolder(File folder, String parentFolder, ZipArchiveOutputStream zipOut) throws IOException {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
zipFolder(file, parentFolder + file.getName() + "/", zipOut);
} else {
ArchiveEntry entry = zipOut.createArchiveEntry(file, parentFolder + file.getName());
zipOut.putArchiveEntry(entry);
FileInputStream fis = new FileInputStream(file);
IOUtils.copy(fis, zipOut);
zipOut.closeArchiveEntry();
fis.close();
}
}
}
}
这些示例代码可以帮助你了解如何使用 Java 标准库和 Apache Commons Compress 库来压缩文件。根据你的实际需求,你可以选择其中一种方式来实现文件压缩。记得根据需要适当处理异常、关闭流等。