Java中的Zip流
在Java中,zip流是一种用于压缩和解压缩文件的流。它可以将多个文件或目录压缩成一个zip文件,也可以将zip文件解压缩成多个文件或目录。在本文中,我们将介绍如何在Java中使用Zip流,并提供一些示例代码来演示其用法。
ZipOutputStream
ZipOutputStream
是Java中用于创建zip文件的输出流。它可以将多个文件或目录压缩成一个zip文件。以下是一个使用ZipOutputStream
创建zip文件的示例代码:
import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) {
String sourceDir = "path/to/source/directory";
String zipFile = "path/to/destination/zipfile.zip";
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
File file = new File(sourceDir);
zipDirectory(file, file.getName(), zos);
System.out.println("Zip file created successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void zipDirectory(File dir, String dirName, ZipOutputStream zos) throws IOException {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
if (file.isDirectory()) {
zipDirectory(file, dirName + "/" + file.getName(), zos);
} else {
zipFile(file, dirName, zos);
}
}
}
}
private static void zipFile(File file, String dirName, ZipOutputStream zos) throws IOException {
FileInputStream fis = new FileInputStream(file);
ZipEntry zipEntry = new ZipEntry(dirName + "/" + file.getName());
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
fis.close();
zos.closeEntry();
}
}
在上面的代码中,我们首先指定了要压缩的源目录sourceDir
和要创建的zip文件zipFile
。然后,我们使用FileOutputStream
和ZipOutputStream
来创建一个输出流,将文件写入到zip文件中。
zipDirectory
方法用于递归地压缩目录和子目录中的所有文件。如果遇到子目录,它将调用自己来压缩子目录中的文件。zipFile
方法用于压缩单个文件。
注意,在使用ZipOutputStream
时,我们需要在使用完后手动关闭ZipOutputStream
和FileOutputStream
。使用try-with-resources
语句可以确保资源会被正确关闭,即使发生异常。
ZipInputStream
ZipInputStream
是Java中用于解压缩zip文件的输入流。它可以从zip文件中读取文件,并将其解压缩到指定目录中。以下是一个使用ZipInputStream
解压缩zip文件的示例代码:
import java.io.*;
import java.util.zip.*;
public class UnzipExample {
public static void main(String[] args) {
String zipFile = "path/to/source/zipfile.zip";
String destDir = "path/to/destination/directory";
try (FileInputStream fis = new FileInputStream(zipFile);
ZipInputStream zis = new ZipInputStream(fis)) {
ZipEntry zipEntry;
byte[] buffer = new byte[1024];
while ((zipEntry = zis.getNextEntry()) != null) {
File newFile = new File(destDir, zipEntry.getName());
if (zipEntry.isDirectory()) {
newFile.mkdirs();
} else {
new File(newFile.getParent()).mkdirs();
extractFile(zis, newFile, buffer);
}
}
System.out.println("Zip file extracted successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void extractFile(ZipInputStream zis, File newFile, byte[] buffer) throws IOException {
try (FileOutputStream fos = new FileOutputStream(newFile)) {
int length;
while ((length = zis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
}
}
在上面的代码中,我们首先指定了要解压缩的zip文件zipFile
和要创建的目录destDir
。然后,我们使用FileInputStream
和ZipInputStream
创建一个输入流,用于读取zip文件中的内容。
extractFile
方法用于将zip文件中的单个文件