解压缩与压缩(高级流)
解压缩与压缩(高级流)
-
解压缩流属于输入流,
-
压缩流属于输出流,
-
解压本质:
- 压缩包里每个文件在Java中都是ZipEntry
- 本质就是把每一个ZipEntry按照层级拷贝到本地另一个文件夹中
package io流; import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class jieyasuo { public static void main(String[] args) { //1.创建一个File表示要解压的压缩包 File src = new File("D:\\code\\练习文件.zip"); //2.创建一个File表示解压的目的地 File dest = new File("D:\\"); //调用方法 } public static void unzip(File src,File dest) throws IOException { //解压的本质:把压缩包里的每一个文件夹,文件读取出来,按照层级拷贝到目的地当中 //创建一个解压缩流用来读取压缩包中的数据 ZipInputStream zip = new ZipInputStream(new FileInputStream(src)); /*1.在Java的IO体系中,字节流和字符流是**处理数据的最底层,最基础的方式** 2.对于ZipInputStream来说,他的功能是 解析zip格式的压缩包结构,但他本身不能直接读取文件--必须依赖一个字节输入流来提供原始字节数据,他才能基于这些字节解析出压缩包具体内容,最终实现解压逻辑 3.简单说,字节输入流是数据载体,ZipInputStream是解析器 */ //要先获取压缩包里面的每一个zipentry对象 //表示当前在压缩包中获取的文件或文件夹 ZipEntry entry; while ((entry=zip.getNextEntry())!=null){ System.out.println(entry); if(entry.isDirectory()){ //isDirectory同ifFile的作用一样,判断是否文件夹 //文件夹:需要在目的地dest创建一个同样的文件夹 File file = new File(dest,entry.toString()); file.mkdirs(); }else{ //文件:需要读取到压缩包中的文件,并把他存放到目的地dest当中(按照层级目录进行存放) FileOutputStream fos = new FileOutputStream(new File(dest,entry.toString())); int b; while ((b=zip.read())!=-1){ //写道目的地 fos.write(b); } fos.close(); //表示在压缩包中的一个文件夹处理完毕了 zip.closeEntry(); } } zip.close(); } } -
压缩
- 单个文件
package io流; import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class yasuo { public static void main(String[] args) throws IOException { /* 压缩流 */ //1.创建File对象表示要压缩的文件 File src = new File("D:\\aaa.txt"); //2.创建File对象表示压缩包的位置 File dest = new File("D:\\"); //3.调用方法来压缩 toZip(src, dest); } public static void toZip(File src,File dest) throws IOException { //1.创建压缩流关联压缩包 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest,"a.zip"))); //2.创建ZipEntry对象,表示压缩包里面的每一个文件和文件夹 ZipEntry entry=new ZipEntry("a.txt"); //3.把ZipEntry对象放到压缩包当中 zos.putNextEntry(entry); //4.把src文件中的数据写道压缩包当中 FileInputStream fis = new FileInputStream(src); int b; while((b=fis.read())!=-1){ zos.write(b); } zos.closeEnry(); zos.close(); } } -
多个文件,文件夹
package io流;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class duoyasuo {
public static void main(String[] args) throws IOException {
//1.创建File对象表示要压缩的文件
File src = new File("D:\\aaa");
//2.创建File对象表示压缩包放在那里(压缩包的父级路径)
File destparent = src.getParentFile();//D:\\
//3.创建File对象表示压缩包的路径
File dest = new File(destparent, src.getName() + ".zip");
//4.创建压缩流关联压缩包
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(dest));
//5.获取src里面的每一个文件,编程ZipEntry对象,放入到压缩包中
toZip(src, zos, src.getName());
}
private static void toZip(File src, ZipOutputStream zos, String name) throws IOException {
//1.进入文件夹
File[] files=src.listFiles();
//2.便利数组
for (File file : files) {
if(file.isFile()){
//3.判断-文件,变成ZipEntry对象,放入到压缩包当中
ZipEntry entry=new ZipEntry(name+"\\"+file.getName());
zos.putNextEntry(entry);
}else{
//4.判断-文件夹,递归
toZip(file,zos,name+"\\"+file.getName());
}
}
}
}

浙公网安备 33010602011771号