在 Java 中,你可以使用不同的方式将多个文件压缩成 ZIP 文件。以下是两种常见的实现方式,包括使用 Java 内置库和使用第三方库的方法。我将提供每种方式的详细步骤和示例代码,并在可能的情况下,列出 Maven 和 Gradle 的依赖坐标。
这种方法使用 java.util.zip
包中的类来压缩文件。以下是实现的步骤:
ZipOutputStream
。ZipOutputStream
以完成压缩。示例代码:
import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) {
String[] filesToCompress = {"file1.txt", "file2.txt"};
try {
FileOutputStream fos = new FileOutputStream("compressed.zip");
ZipOutputStream zipOut = new ZipOutputStream(fos);
for (String file : filesToCompress) {
File currentFile = new File(file);
FileInputStream fis = new FileInputStream(currentFile);
ZipEntry zipEntry = new ZipEntry(currentFile.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();
}
}
}
Apache Commons Compress 库提供了更高级别的 API,更容易使用,并且支持各种压缩格式。在使用之前,需要添加相关依赖。
Maven 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
Gradle 依赖:
implementation 'org.apache.commons:commons-compress:1.21'
实现步骤:
org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
创建 ZIP 输出流。示例代码:
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import java.io.*;
public class ApacheCommonsZipExample {
public static void main(String[] args) {
String[] filesToCompress = {"file1.txt", "file2.txt"};
try {
FileOutputStream fos = new FileOutputStream("compressed_commons.zip");
BufferedOutputStream bos = new BufferedOutputStream(fos);
ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(bos);
for (String file : filesToCompress) {
File currentFile = new File(file);
ZipArchiveEntry zipEntry = new ZipArchiveEntry(currentFile, currentFile.getName());
zipOut.putArchiveEntry(zipEntry);
FileInputStream fis = new FileInputStream(currentFile);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
fis.close();
zipOut.closeArchiveEntry();
}
zipOut.finish();
zipOut.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
无论你选择使用 Java 的内置库还是第三方库,都可以根据你的需求和项目的特定要求来选择最适合的方法。