1.1 读操作
1.1.1 理论
-
定义上:ZipInputStream流是FilterInputStream的间接子类,可以说明它是""装饰流“,即在FileInputStream的基础上增加了某种逻辑得到了新的功能。
-
形式上: 和其他“装饰流”一样,创建它的实例时,需要传入一个InputStream的子类作为参数,这也证实了它是在InputStream的基础上添加某种功能
-
特殊方法:getNextEntry() -> 可以返回一个ZipEntry类型的变量,该返回值拥有多个方法,可以得到你所需的内容。
-
实现“读”的理论基础:压缩包的读取,可以把压缩包里的文件看作一个一个ZipEntry类,把压缩包里的ZipEntry对象遍历出来即就是把文件读取出来了
-
“读“操作的流程:创建ZipInputStream流,给出目标压缩包 -> 循环遍历出ZipEntry对象 -> 从ZipEntry对象中获取内容
1.1.2 代码实现
public class Test01 { public static void main(String[] args) { //1.创建ZipInputStream实例,在实例化时传入拥有目标文件的文件输入流参数 try (ZipInputStream zip = new ZipInputStream(new FileInputStream("d:\\story2.zip"))){ //2.在外部定义该类可以扩大作用域 ZipEntry entry = null; //3.循环遍历出压缩包里的entry,如果遍历结束返回null while((entry = zip.getNextEntry()) != null) { //4.获取文件名称 String name = entry.getName(); //5.判断该entry是否为文件夹,如果不是则遍历内容 if(!entry.isDirectory()) { int n; while((n = zip.read()) != -1) { System.out.print((char)n); } } } } catch (IOException e1) { e1.printStackTrace(); } } }
1.2 写操作
1.2.1 理论
-
实现“写操作”的流程:
创建压缩输出流对象 -> 遍历出原始目录下的子文件 -> 使用putNextEntry()方法将每个子文件包装成ZipEntry类型放入到压缩输出流对象 -> 将原文件的字节内容,写入zip压缩包 -> 结束当前zipEntry
1.2.3 代码实现
public class Test01 { public static void main(String[] args) { //原始目录 File rootDir = new File("d:\\picture"); //将原始目录中的文件,“写入”zip压缩文件 try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) { //获取并遍历原始目录下的子文件按列表 File[] files = rootDir.listFiles(); for (File file : files) { //创建一个zipEntry out.putNextEntry(new ZipEntry(file.getName())); //将原文件的字节内容,写入zip压缩 out.write(Files.readAllBytes(file.toPath())); //结束当前zipEntry out.closeEntry(); } } catch (IOException e) { e.printStackTrace(); } } }