zip的读取和写入需要引入zipInputStream和zipOutStream
读取zip文件时,一般要在ziplnputStream传入一个FileinputStream作为数据源,并且需要循环调用getNextStream(),当返回值为null是循环结束, getNextStream()方法的返回值类型为zipEntry,作用是为了获取压缩文件的每个子文件,要想获取压缩文件的内容,就需要调用read() 进行不断的读取,直到返回-1.
代码如下:
public class Damo01 {
public static void main(String[] args) {
//要进行解压缩的文件
File file = new File("F:\\陈嘻嘻\\1-201023201325.zip");
//获取文件名
String zipfilename = file.getName();
//根据zip文件名称,根据压缩目录名称
String zipname =zipfilename.substring(0,zipfilename.indexOf("."));
//创建解压目录
File tagt = new File(file.getParent()+"\\"+zipname);
if (!tagt.exists()) {
tagt.mkdir();//创建目录
}
//
try (ZipInputStream zipin = new ZipInputStream(new FileInputStream(file),Charset.forName("gbk"))) {
//
ZipEntry zipentry = null;
//
while ((zipentry=zipin.getNextEntry())!=null) {
//获取zip压缩包子文件名称
String zipname1 = zipentry.getName();
System.out.println(zipname1);
//创建文件输出流
String filepath =tagt.getPath()+"\\"+zipname1;
System.out.println(filepath);
try(BufferedOutputStream bt = new BufferedOutputStream(new FileOutputStream(filepath))) {
//读取该文件的字节内容
byte[] by = new byte[1024];
int len =-1;
while ((len = zipin.read(by))!=-1) {
bt.write(by,0,len);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
zip文件的写入,即将文件打包成为压缩包,同样的将文件打包成为压缩包,需要引入zipOutStream,也要需要传入一个inputStream的子类作为数据源,
首先需要调用putNextEntry()方法,目的是为了创建一个ZipEntry,然后调用write()方法将原文件的字节文件内容,写入zip压缩包,需要注意的是写入的压缩包应与原始目录在同一父级目录下。
代码如下:
public class Damo02 {
public static void main(String[] args) {
//原始目录
File rootDir = new File("F:\\陈嘻嘻\\新建文件夹");
//将原始目录中的文件写入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();
}
}
}