【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 {
//文件:读取文件中的数据,存放到目的地dest
FileOutputStream 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();
}
}