今天我们将研究Java zip文件的例子。我们还将使用Java程序压缩文件夹并创建zip文件。
Java ZIP
java.util.zip.ZipOutputStream
可用于将文件压缩为ZIP格式。由于zip文件可以包含多个条目,ZipOutputStream使用java.util.zip.ZipEntry
表示zip文件条目。
Java ZIP文件
为单个文件创建zip存档非常简单,我们需要从目标文件的FileOutputStream对象创建一个ZipOutputStream对象。然后,我们向ZipOutputStream添加一个新的ZipEntry,并使用FileInputStream读取源文件到ZipOutputStream对象。完成写入后,我们需要关闭ZipEntry并释放所有资源。
Java Zip文件夹
压缩一个目录有点棘手,首先我们需要获取文件列表的绝对路径。然后逐个处理它们。我们需要为每个文件添加一个 ZipEntry,并使用 FileInputStream 读取源文件的内容到与该文件对应的 ZipEntry 中。
Java 压缩示例
这是一个显示如何在 Java 中压缩单个文件或文件夹的 Java 程序。
package com.journaldev.files;
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 ZipFiles {
List filesListInDir = new ArrayList();
public static void main(String[] args) {
File file = new File("/Users/pankaj/sitemap.xml");
String zipFileName = "/Users/pankaj/sitemap.zip";
File dir = new File("/Users/pankaj/tmp");
String zipDirName = "/Users/pankaj/tmp.zip";
zipSingleFile(file, zipFileName);
ZipFiles zipFiles = new ZipFiles();
zipFiles.zipDirectory(dir, zipDirName);
}
/**
* This method zips the directory
* @param dir
* @param zipDirName
*/
private void zipDirectory(File dir, String zipDirName) {
try {
populateFilesList(dir);
// 现在逐个压缩文件
// 创建 ZipOutputStream 来写入 zip 文件
FileOutputStream fos = new FileOutputStream(zipDirName);
ZipOutputStream zos = new ZipOutputStream(fos);
for(String filePath : filesListInDir){
System.out.println("Zipping "+filePath);
// 对于 ZipEntry,我们只需要保留相对文件路径,因此我们在绝对路径上使用了子字符串
ZipEntry ze = new ZipEntry(filePath.substring(dir.getAbsolutePath().length()+1, filePath.length()));
zos.putNextEntry(ze);
// 读取文件并写入 ZipOutputStream
FileInputStream fis = new FileInputStream(filePath);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
fis.close();
}
zos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* This method populates all the files in a directory to a List
* @param dir
* @throws IOException
*/
private void populateFilesList(File dir) throws IOException {
File[] files = dir.listFiles();
for(File file : files){
if(file.isFile()) filesListInDir.add(file.getAbsolutePath());
else populateFilesList(file);
}
}
/**
* This method compresses the single file to zip format
* @param file
* @param zipFileName
*/
private static void zipSingleFile(File file, String zipFileName) {
try {
// 创建 ZipOutputStream 来写入 zip 文件
FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
// 向 ZipOutputStream 添加一个新的 Zip Entry
ZipEntry ze = new ZipEntry(file.getName());
zos.putNextEntry(ze);
// 读取文件并写入 ZipOutputStream
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
// 关闭 ZipEntry 来写入 zip 文件
zos.closeEntry();
// 关闭资源
zos.close();
fis.close();
fos.close();
System.out.println(file.getCanonicalPath()+" is zipped to "+zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述 Java 压缩示例程序的输出是:
/Users/pankaj/sitemap.xml is zipped to /Users/pankaj/sitemap.zip
Zipping /Users/pankaj/tmp/.DS_Store
Zipping /Users/pankaj/tmp/data/data.dat
Zipping /Users/pankaj/tmp/data/data.xml
Zipping /Users/pankaj/tmp/data/xmls/project.xml
Zipping /Users/pankaj/tmp/data/xmls/web.xml
Zipping /Users/pankaj/tmp/data.Xml
Zipping /Users/pankaj/tmp/DB.xml
Zipping /Users/pankaj/tmp/item.XML
Zipping /Users/pankaj/tmp/item.xsd
Zipping /Users/pankaj/tmp/ms/data.txt
Zipping /Users/pankaj/tmp/ms/project.doc
请注意,当在目录中记录文件到 zip 时,我打印绝对路径。但是在添加 zip 条目时,我使用目录中的相对路径,这样当我们解压缩时,它将创建相同的目录结构。这就是 Java 压缩示例的全部内容。
Source:
https://www.digitalocean.com/community/tutorials/java-zip-file-folder-example