在此示例中,您将学习如何递归压缩或压缩目录。压缩文件格式允许我们压缩多个文件。我们使用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<String> 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