【JAVA入门】Day45 - 压缩流 / 解压缩流
文章目录
- 【JAVA入门】Day45 - 压缩流 / 解压缩流
- 一、解压缩流
- 二、压缩流
在文件传输过程中,文件体积比较大,传输较慢,因此我们发明了一种方法,把文件里的数据压缩到一种压缩文件中,将体积减小,传输完毕后,再用解压缩方法把数据解压出来。这就是压缩流和解压缩流的诞生初衷。
解压缩流和压缩流在体系中的位置如下,它们是字节输入输出流的高级包装类。
一、解压缩流
解压的本质是把压缩包中的每一个 ZipEntry 对象(压缩包中的每一个文件都是一个 ZipEntry 对象)按照层级拷贝到本地的另一个文件夹中。
解压缩流是把文件中的内容读入 JVM,因此它属于输入流。
下面的代码演示了如何将一个本地 zip 文件解压。
package ZipStream;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;public class ZipStreamDemo1 {public static void main(String[] args) throws IOException {/*解压缩流D:\IdeaProjects\HelloWord\src\ZipStream\ZipFile.zip*///1.创建一个File表示要解压的压缩包File src = new File("D:\\IdeaProjects\\HelloWord\\src\\ZipStream\\ZipFile.zip");//2.创建一个File表示解压的目的地File dest = new File("D:\\IdeaProjects\\HelloWord\\src\\ZipStream");unzip(src,dest);}//定义一个方法用来解压public static void unzip(File src, File dest) throws IOException {//解压的本质:把压缩包中的每一个文件或者文件夹读取出来//按照层级拷贝到目的地当中//创建一个解压缩流用来读取压缩包中的数据ZipInputStream zip = new ZipInputStream(new FileInputStream(src));//先获取到压缩包中的每一个 zipEntry 对象ZipEntry entry;while ((entry = zip.getNextEntry()) != null) {System.out.println(entry);//遍历到了文件夹:在目的地处创建一个同名文件夹//文件:把它存放到目的地的dest文件夹中if (entry.isDirectory()) {//文件夹:在dest处创建一个同名文件夹File file = new File(dest, entry.toString());file.mkdirs();} else {//文件:读取文件中的数据,存放到目的地destFileOutputStream fos = new FileOutputStream(entry.toString());int b;while ((b = zip.read()) != -1) {//写到目的地fos.write(b);}fos.close();//表示在压缩包中的一个文件处理完毕了zip.closeEntry();}}zip.close();}
}
二、压缩流
压缩的本质其实就是把每一个(文件/文件夹)看成 ZipEntry 对象放到压缩包中。
利用压缩流压缩一个文件的代码如下所示:
package ZipStream;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipStreamDemo2 {public static void main(String[] args) throws IOException {/*压缩流把a.txt打包成一个压缩包*///1.创建File对象表示要压缩的文件File src = new File("D:\\IdeaProjects\\HelloWord\\src\\ZipStream\\a.txt");//2.创建File对象表示压缩包的位置File dest = new File("D:\\IdeaProjects\\HelloWord\\src\\ZipStream");//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.txt")));//2.把要压缩的文件看成一个个的Entry对象,表示压缩包里的每一个文件和文件夹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.closeEntry();zos.close();}
}