在此示例中,您将学习如何递归压缩或压缩目录。压缩文件格式允许我们压缩多个文件。我们使用java.util.zip.ZipOutputStream来压缩文件。zip文件中的每个条目均由java.util.zip.ZipEntry类表示。
要压缩目录,我们必须首先获取指定目录中的所有文件列表,包括子目录中的所有文件。在示例中,此任务由getFileList()方法处理。此方法将文件列表存储在fileList变量中,以供以后在压缩过程中创建时使用ZipEntry。
下面的代码示例向您展示如何使用zip压缩多个文件。package org.nhooo.example.zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipDirectoryExample {
private List fileList = new ArrayList<>();
public static void main(String[] args) {
String dir = "D:\\Data";
String zipFile = "D:\\Data.zip";
ZipDirectoryExample zip = new ZipDirectoryExample();
zip.compressDirectory(dir, zipFile);
}
private void compressDirectory(String dir, String zipFile) {
File directory = new File(dir);
getFileList(directory);
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String filePath : fileList) {
System.out.println("Compressing: " + filePath);
// 创建一个zip条目。
String name = filePath.substring(
directory.getAbsolutePath().length() + 1,
filePath.length());
ZipEntry zipEntry = new ZipEntry(name);
zos.putNextEntry(zipEntry);
// 读取文件内容并写入zip输出流。
try (FileInputStream fis = new FileInputStream(filePath)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
// 关闭邮递区号。
zos.closeEntry();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Get files list from the directory recursive to the sub directory.
*/
private void getFileList(File directory) {
File[] files = directory.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
if (file.isFile()) {
fileList.add(file.getAbsolutePath());
} else {
getFileList(file);
}
}
}
}
}
上面的代码段将压缩D:\Data目录,并将产生一个名为的zip文件Data.zip。运行该程序时,您可以在控制台中看到以下内容:Compressing: D:\Data\Aa.txt
Compressing: D:\Data\AA1a1.txt
Compressing: D:\Data\Bb.txt
Compressing: D:\Data\Cc.txt
Compressing: D:\Data\CC1c1.txt
Compressing: D:\Data\Dd.txt