操作zip压缩文件时需要使用ZipInputStream类和ZipOutputStream类,分别是一种FilterInputStream和FilterOutputStream,可以直接读取zip包的内容,将指定内容写入zip包。
读取zip包:首先要创建一个ZipInputStream,通常传入一个FileInputStream作为数据源,然后循环调用getNextEntry(),直到返回null,则表示zip流结束。
try (ZipInputStream in = new ZipInputStream(new FileInputStream("E:\\test\\1-201023201325.zip"),Charset.forName("gbk"))) {
ZipEntry entry = null;
//获取压缩文件中的每个字节
while((entry = in.getNextEntry()) != null) {
System.out.println(entry.getName());
}
} catch (IOException e) {
.printStackTrace();
}
Charset.forName("gbk")添加字符集编码,否则会出现java.lang.IllegalArgumentException: MALFORMED异常信息,导致程序不能正常运行出结果。
下面介绍一个读取zip包的简单案例实现解压缩zip:
public class demo03 {
public static void main(String[] args) {
//要进行解压缩的zip文件
File zipFile = new File("E:\\test\\1-201023201325.zip");
//1. 创建解压缩目录
//获取zip文件的名称
String zipFileName = zipFile.getName();
//根据zip文件名称,提取解压缩的名称
String targetDirName = zipFileName.substring(0, zipFileName.indexOf("."));
//创建解压缩目录
//zipFile.getParent()获取的是zipFile所在的父级目录
File targetDir = new File(zipFile.getParent()+"\\"+targetDirName);
if(!targetDir.exists()) {
targetDir.mkdir(); //创建目录
}
//2.解析读取zip文件
try (ZipInputStream in = new ZipInputStream(new
FileInputStream(zipFile),Charset.forName("gbk"))) {
ZipEntry zipEntry = null;
while((zipEntry = in.getNextEntry()) != null) {
//获取zip压缩包中的子文件名称
String zipEntryFileName = zipEntry.getName();
//创建该文件的输出流
String zipFilePath = targetDir.getPath()+"\\"+zipEntryFileName;
try(BufferedOutputStream bos = new BufferedOutputStream(new
FileOutputStream(zipFilePath))){
//读取该子文件的字节内容
byte[] buff = new byte[1024];
int len = -1;
while((len = in.read(buff)) != -1) {
bos.write(buff,0,len);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
写入zip包:首先要创建一个ZipOutputStream,通常传入一个FileOutputStream作为数据源,然后,每写入一个文件前,先调用putNextEntry(),然后使用write()写入byte[]数据,完毕后调用closeEntry()结束文件打包。
//原始目录
File rootDir = new File("E:\\test\\20220529");
//将原始目录中的文件,写入zip压缩文件
try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent()+"\\"+rootDir.getName()+".zip"))) {
//获取并遍历原始目录下的子文件列表
File[] files = rootDir.listFiles();
for(File f : files) {
//创建一个zipEntry
out.putNextEntry(new ZipEntry(f.getName()));
//将原文件的字节内容,写入zip压缩包
out.write(Files.readAllBytes(f.toPath()));
//结束当前ZipEntry
out.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
下面介绍一个写入zip包 的简单案例将指定文件写至zip文件:
public class demo04 {
public static void main(String[] args) {
//原始目录
File rootDir = new File("E:\\test\\20220529");
//将原始目录中的文件,写入zip压缩文件
try (ZipOutputStream out = new ZipOutputStream(new
FileOutputStream(rootDir.getParent()+"\\"+rootDir.getName()+".zip"))) {
//获取并遍历原始目录下的子文件列表
File[] files = rootDir.listFiles();
for(File f : files) {
//创建一个zipEntry
out.putNextEntry(new ZipEntry(f.getName()));
//将原文件的字节内容,写入zip压缩包
out.write(Files.readAllBytes(f.toPath()));
out.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上就是读取zip包和写入zip包操作的简单介绍,如有不当之处还请大家多多指正,一起学习,一起进步!