在Java中,我们可以直接来读取压缩包(zip包),ZipInputStream就可以直接读取zip包的内容,接下来,我们就来看看zip包的读取和写入。
首先,我们先来看看zip文件的读取,我们在读取zip文件时,首先应该创建一个ZipInputStream,它也是一种FilterInputStream类,我们在创建好ZipInputStream后,通常会传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束。
zip文件的读取代码如下:
package com.hpc.wyj04;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Decorator02 {
public static void main(String[] args) {
try (ZipInputStream in = new ZipInputStream(
new FileInputStream("e:\\button.zip")
,Charset.forName("gbk"))) {
ZipEntry zip=null;
//获取压缩文件中的每个子文件
while((zip=in.getNextEntry())!=null) {
System.out.println(zip.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
既然Java可以直接读取zip文件,我们就可以利用Java程序来进行一个解压缩包的操作,我们只需要在读取zip文件的基础上加上写入的目录和具体的文件即可,具体实现代码如下:
package com.hpc.wyj04;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Decorator03 {
public static void main(String[] args) {
//要进行解压缩的zip文件
File zipFile=new File(
"C:\\Users\\我\\Documents\\Tencent Files\\464822504\\FileRecv\\1-201023201325.zip");
//1、创建解压缩目录
//获取zip文件的名称
String zipFileName=zipFile.getName();
//根据zip文件名称,提取压缩目录的名称
String targetDirName=zipFileName.substring(0,zipFileName.indexOf("."));
//创建解压缩目录
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"))) {
//遍历zip文件中的每个子文件
ZipEntry zipentry=null;
while((zipentry=in.getNextEntry())!=null) {
//获取zip压缩包中的子文件名称
String zipentryFileName=zipentry.getName();
//创建该文件的输出流
String zipFilePath=targetDir.getPath()+"\\"+zipentryFileName;
//输出流定义在try()块,结束自动清空缓冲区并关闭
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);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下来,我们来看看将指定文件写入zip文件,和zip文件的读取类似,我们首先需要创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[ ]数据,写入完毕后调用closeEntry()结束这个文件的打包。
具体实现代码如下:
package com.hpc.wyj04;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 将指定文件写入zip文件
* @author 我
*
*/
public class Decorator04 {
public static void main(String[] args) {
//原始目录
File file=new File("D:\\360安全浏览器下载\\advise\\css");
//将原始目录中的文件,”写入“zip压缩文件
try (ZipOutputStream out = new ZipOutputStream(
new FileOutputStream(
file.getParent()+"\\"+file.getName()+".zip"))) {
//获取并遍历原始目录下的子文件列表
File[] files=file.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();
}
}
}
ZipOutputStream可以把多份数据写入zip包; 配合FileInputStream和FileOutputStream就可以读写zip文件。