ZipStreamExercise1
java
package ZipStreamExercise20240811;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipStreamExercise1 {
public static void main(String[] args) throws IOException {
// 压缩(解压缩)流 ZipStream 可以压缩(解压缩)文件或压缩(解压缩)文件夹
// ZipOutputStream 压缩流:根据OutputStream创建指定的压缩流对象
// src表示需要压缩的源文件
File src = new File("D:\\Exercise\\words.txt");
// dest表示压缩后压缩包输出的位置
File dest = new File("D:\\");
toZip(src, dest);
}
public static void toZip(File src, File dest) throws IOException {
// ZipOutputStream 压缩流
// 构造方法:
// ZipOutputStream(OutputStream out)
// 创建ZipOutputStream,关联压缩流和压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest, "a.zip")));
// 创建ZipEntry对象,表示压缩包中每一个文件和文件夹
ZipEntry entry = new ZipEntry("aaa\\bbb\\words.txt");
// 将ZipEntry对象放入压缩包
zos.putNextEntry(entry);
// 将src文件中的数据写入压缩包
FileInputStream fis = new FileInputStream(src);
int result;
while ((result = fis.read()) != -1) {
zos.write(result);
}
// 关闭zos流
zos.closeEntry();
zos.close();
}
}
ZipStreamExercise2
java
package ZipStreamExercise20240811;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipStreamExercise2 {
public static void main(String[] args) throws IOException {
// 压缩文件夹
long startTime = System.currentTimeMillis();
// 创建File对象表示需要压缩的文件夹
File src = new File("D:\\Exercise");
// 创建File对象表示压缩包应该输出到哪里
File dest = new File("D:\\Exercise.zip");
// 创建压缩流关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
// 获取src中的每一个文件,变成ZipEntry对象,放入到压缩包中
toZip(src, zos, src.getName());
// 关闭ZipOutput流
zos.close();
long endTime = System.currentTimeMillis();
System.out.println("一共用时" + ((endTime - startTime) / 1000) + "秒"); // 9 - 10s
}
public static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
// 得到src源文件中的所有文件和目录
File[] files = src.listFiles();
// 遍历所有文件
for (File file : files) {
// 判断是否为文件
if (file.isFile()) {
// 如果是文件,那么变成ZipEntry对象并放入压缩包中
ZipEntry entry = new ZipEntry(name + "\\" + file.getName());
// 放入压缩包中
zos.putNextEntry(entry);
// 读取文件的数据,写入压缩包
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[1024 * 1024 * 10];
int len;
while((len = fis.read(bytes)) != -1) {
zos.write(bytes, 0, len);
}
// 关闭文件输入流
fis.close();
zos.closeEntry();
} else if (file.isDirectory()) {
// 若是文件夹,则递归调用toZip方法
toZip(file, zos, name + "\\" + file.getName());
// 假如当前目录是src\\aaa
// file = aaa name = src\\aaa
// name + "\\" + file.getName()的意思:
// name表示父级文件夹的名字,+"\\"表示层级关系,file.getName可以得到当前文件夹的名字,组合起来才可以得到正确的层级关系的目录名
}
}
}
}
ZipStreamExercise3
java
package ZipStreamExercise20240811;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipStreamExercise3 {
public static void main(String[] args) throws IOException {
// 1. 创建一个表示要解压的压缩包的 File 对象
File src = new File("D:\\Exercise.zip");
// 2. 创建一个表示解压目的地的 File 对象
File dest = new File("D:\\Exercise");
// 调用解压方法
unzip(src, dest);
}
// 定义一个解压方法
public static void unzip(File src, File dest) throws IOException {
// 创建一个 ZipInputStream 来读取压缩包
try (ZipInputStream zip = new ZipInputStream(new FileInputStream(src))) {
ZipEntry entry;
while ((entry = zip.getNextEntry()) != null) {
System.out.println(entry);
File file = new File(dest, entry.getName());
if (entry.isDirectory()) {
// 在目的地创建目录
file.mkdirs();
} else {
// 确保父目录已创建
new File(file.getParent()).mkdirs();
// 将文件写入目的地
try (FileOutputStream fos = new FileOutputStream(file)) {
byte[] buffer = new byte[1024];
int len;
while ((len = zip.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
}
}
zip.closeEntry();
}
}
}
}