package edu.mama.ls16;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipIO {
public static void main(String[] args) throws IOException {
//文件压缩(相对路径)
String[] zipArray = {"res/语录1.txt", "res/语录2.txt", "res/英文资料.txt"};
zip(zipArray, "res/ZipFile.zip");
//文件解压(相对路径)
unzip("res/秘密相册.zip", "res/");
}
public static void zip(String[] sourceFileArray, String targetPath) throws IOException {
//因为需要在try内部不断对fileInputStream赋值,故定义为公共变量,方便关闭资源
FileInputStream fileInputStream = null;
//定义压缩资源的文件条目,同样需要不断进行赋值
ZipEntry zipEntry = null;
//try ~ resource 写法,给压缩步骤(输出流)开流
try (ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(targetPath))) {
for (String item : sourceFileArray) {
//将文件送入输入流
fileInputStream = new FileInputStream(item);
//记录文件条目
zipEntry = new ZipEntry(item);
zipOutputStream.putNextEntry(zipEntry);
//输入流直接对接输出流
fileInputStream.transferTo(zipOutputStream);
}
//关闭文件条目
zipOutputStream.closeEntry();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void unzip(String sourcePath, String targetPath) throws IOException {
//定义输出流
FileOutputStream fileOutputStream = null;
//try ~ resource 给解压缩步骤(输入流)开流
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(sourcePath))) {
//获取文件条目
ZipEntry zipEntry = zipInputStream.getNextEntry();
while (zipEntry != null) {
//输出流的目录是目标路径拼接上文件的名称
fileOutputStream = new FileOutputStream(targetPath + zipEntry.getName());
//输入流对接输出流
zipInputStream.transferTo(fileOutputStream);
//更新文件条目为下一条
zipEntry = zipInputStream.getNextEntry();
}
//关闭文件条目
zipInputStream.closeEntry();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}