Java Zip文件读写操作详解
前言
Zip文件是一种常见的压缩文件格式,它可以有效地压缩多个文件,减小文件占用的存储空间。在Java开发中,也会经常用到Zip文件,因此掌握Java Zip文件读写操作是非常有必要的。
Zip文件读取操作
读取Zip文件可以使用Java中的ZipInputStream来实现。ZipInputStream可以将Zip文件中的多个文件逐一读取出来。
示例1:读取Zip文件中的单个文件并输出内容
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileReaderDemo {
public static void main(String[] args) throws IOException {
String zipFilePath = "/path/to/zip/file.zip";
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
if (entry.isDirectory()) {
continue;
}
System.out.println("Entry Name: " + entry.getName());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = zis.read(buffer)) != -1) {
baos.write(buffer, 0, count);
}
String data = baos.toString("UTF-8");
System.out.println("Content: " + data);
}
zis.closeEntry();
zis.close();
}
}
代码中,我们首先实例化了一个ZipInputStream,该对象的构造函数需要传入Zip文件的输入流。然后,我们通过调用getNextEntry()方法依次获取Zip文件中的每个ZipEntry,也就是每个被压缩的文件。每读取一个ZipEntry,我们就分别读取它的文件名,以及文件内容和convertToString()将二进制读取过来的内容转换为字符串类型的输出。
示例2:读取Zip文件中的多个文件并解压到指定目录
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipFileReaderDemo {
public static void main(String[] args) throws IOException {
String zipFilePath = "/path/to/zip/file.zip";
Path unzipPath = Paths.get("/path/to/unzip/folder");
//创建解压目录
if (!Files.exists(unzipPath)) {
Files.createDirectories(unzipPath);
}
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
//如果是目录则跳过
if (entry.isDirectory()) {
continue;
}
//解压到指定目录
Path outputPath = unzipPath.resolve(entry.getName());
try (OutputStream outputStream = Files.newOutputStream(outputPath)) {
byte[] buffer = new byte[1024];
int count;
while ((count = zis.read(buffer)) != -1) {
outputStream.write(buffer, 0, count);
}
outputStream.flush();
}
zis.closeEntry();
}
zis.close();
}
}
示例2与示例1所实现的功能不同,它将Zip文件中的多个文件解压到了指定的目录下。解压的操作也比较简单,首先我们需要判断ZipEntry是否为目录类型,如果是则跳过。否则,我们就根据ZipEntry的名称创建相应的输出文件路径,并通过Files.newOutputStream()创建文件的输出流。之后,我们使用byte数组来读取ZipInputStream中读取到的数据,并将它写入到输出流中即可。
Zip文件写入操作
Zip文件的写入操作可以使用Java的ZipOutputStream来实现。ZipOutputStream可以将多个文件压缩成一个Zip文件。
示例3:创建新的Zip文件
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileWriterDemo {
public static void main(String[] args) throws IOException {
String zipFilePath = "/path/to/zip/file.zip";
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zos = new ZipOutputStream(fos);
String[] fileNames = {"file1.txt", "file2.txt", "file3.txt"};
for (String fileName : fileNames) {
ZipEntry entry = new ZipEntry(fileName);
zos.putNextEntry(entry);
FileInputStream fis = new FileInputStream("/path/to/source/" + fileName);
byte[] buffer = new byte[1024];
int count;
while ((count = fis.read(buffer)) != -1) {
zos.write(buffer, 0, count);
}
fis.close();
zos.closeEntry();
}
zos.close();
}
}
代码中,我们首先实例化了一个ZipOutputStream,该对象的构造函数需要传入Zip文件的输出流。然后,我们将需要压缩的文件名保存在一个数组中,在循环中依次将这些文件压缩到Zip中。我们首先需要实例化ZipEntry,并通过putNextEntry()方法告诉ZipOutputStream这是一个新的ZipEntry。然后,我们读取需要压缩的文件,并且将读取到的文件数据写入ZipOutputStream中。最后,我们通过调用closeEntry()方法来告诉ZipOutputStream当前ZipEntry的写入结束。
示例4:向已存在的Zip文件写入文件
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileWriterDemo {
public static void main(String[] args) throws IOException {
String zipFilePath = "/path/to/zip/file.zip";
FileOutputStream fos = new FileOutputStream(zipFilePath, true);
ZipOutputStream zos = new ZipOutputStream(fos);
ZipEntry entry = new ZipEntry("new_file.txt");
zos.putNextEntry(entry);
FileInputStream fis = new FileInputStream("/path/to/source/new_file.txt");
byte[] buffer = new byte[1024];
int count;
while ((count = fis.read(buffer)) != -1) {
zos.write(buffer, 0, count);
}
fis.close();
zos.closeEntry();
zos.close();
}
}
代码中,我们打开一个已存在的Zip文件,并且设置ZipOutputStream构造函数的第二个参数为true,表明我们需要以追加模式打开Zip文件。之后,我们通过ZipEntry创建一个新的ZipEntry,并将它压缩到ZipOutputStream中,与示例3的写法类似。注意,我们需要调用ZipOutputStream的closeEntry()方法来告诉它当前的ZipEntry写入结束。
总结
Zip文件读写在Java中是比较常用的操作。读取Zip文件可以使用ZipInputStream来实现,将文件写入Zip文件可以使用ZipOutputStream来实现。Zip文件的读写操作大致需要经历获取ZipEntry、读取文件内容、判断ZipEntry类型、创建ZipEntry等步骤,熟悉这些操作可以更高效地处理Zip文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Zip文件读写操作详解 - Python技术站