ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容
另一个JarInputStream是从ZipInputStream派生,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。因为本质上jar包就是zip包,只是额外增加了一些固定的描述文件。
读取zip包:
首先要创建一个zipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束。一个zipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1;
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 Test02 {
public static void main(String[] args) {
try (ZipInputStream in = new ZipInputStream(new FileInputStream("c:\\Users\\49980\\Desktop\\实验四.zip"),Charset.forName("gbk"))) {
ZipEntry entry = null;
//获取压缩文件中的每个子文件
while ((entry = in.getNextEntry())!= null) {
...
...
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
写入zip包:
ZipOutputStream是一种FilterOutputStream,它可以直接写入内容到zip包。我们要创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后每写入一个文件前,先调用putNextentry(),然后用write()写入byte[]数据,写入完毕后调用closeEntry()结束这个文件的打包。
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;
public class test02 {
public static void main(String[] args) {
//原始目录
File rootDir = new File("c:\\data\\img");
//将原始目录中的文件,“写入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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}