一. 压缩和解压缩
生活中,我们常见的有 .zip(Windows系统), .jar, .gzip(Linux系统) 等压缩包。 Java语言,也可以实现 压缩和解压缩的功能 。
一个压缩包:
data.txt, data2.txt,129.png 都放置在 A.zip 压缩文件下, 它们叫做 ZipEntry,是文件条目。
我们要想压缩文件, 需要用到 ZipOutputStream 类。
压缩的那个文件,如 A.zip ,不能用普通的 File 类进行接收, 而应该用 ZipFile 类。
我们想要解压缩, 那么需要用到 ZipInputStream 类。
所以,压缩和解压缩 需要用到 ZipEntry, ZipOutputStream, ZipFile, ZipInputStream 四个类。
二. 文件条目 ZipEntry
public class ZipEntry implements ZipConstants, Cloneable { }
父类是 Object.
二.一 方法
二.一.一 构造方法
二.一.一.一 方法
二.一.一.二 演示
public void entryConTest(){ //第一种方式 ZipEntry zipEntry=new ZipEntry("压缩文件.txt"); //第二种方式 ZipEntry zipEntry1=new ZipEntry(zipEntry); }
一般都采用第一种方式, 直接传入唯一的文件名称。
二.一.二 其他方法
单独的 ZipEntry 是无法存在的,需要与其他的对象关联使用。
三. Zip文件压缩输出流 ZipOutputStream
三.一 方法
三.一.一 构造方法
三.一.一.一 方法
三.一.一.二 演示
@Test public void conTest() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"jdk91.zip"); ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(file)); }
三.一.二 其他方法
三.二 演示 ZipOutputStream
三.二.一 压缩单个文件
@Test public void zip1Test() throws Exception{ //找到要压缩的那个文件, 作输入流 File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"jdk9.CHM"); InputStream inputStream=new FileInputStream(file); //定义要压缩到的那个文件为 输出流 File outFile=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"jdk9.zip"); OutputStream outputStream=new FileOutputStream(outFile); //定义ZipOutputStream, 传入目标文件的outputStream ZipOutputStream zipOutputStream=new ZipOutputStream(outputStream); //放置压缩里面的内容,这样就算是放置进去了。 zipOutputStream.putNextEntry(new ZipEntry(file.getName())); //设置注释 zipOutputStream.setComment("这是什么玩意 "); byte[] bytes=new byte[1024]; int len=-1; //读取文件到字节数组 while((len=inputStream.read(bytes))!=-1){ // 进行压缩,写入字节数组 zipOutputStream.write(bytes,0,len); } //关闭 zipOutputStream.close(); outputStream.close(); inputStream.close(); }
压缩前:
运行程序,再次查看文件系统
点进去该文件 jdk9.zip,可以进行查看
注意: 压缩文件时,也可以放置多个文件进去。
zipOutputStream.putNextEntry(new ZipEntry(file.getName())); zipOutputStream.putNextEntry(new ZipEntry(file1.getName())); zipOutputStream.putNextEntry(new ZipEntry(fil2.getName())); zipOutputStream.putNextEntry(new ZipEntry(file3.getName()));
这样 jdk9.zip 里面,就可以有四个文件了。
三.二.二 压缩文件夹
将 data,data2,data3,data4 复制一份到 a 文件夹下。
@Test public void zip2Test() throws Exception{ //1. 定义压缩输入 的目录 File inFile=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"a"); InputStream inputStream=null; //2.定义 压缩输出文件 File outFile=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"a.zip"); ZipOutputStream zipOutputStream=new ZipOutputStream(new FileOutputStream(outFile)); zipOutputStream.setComment("压缩文件夹"); //如果文件是一个目录的话 if(inFile.isDirectory()){ //查询该目录下的文件 File[] fileList=inFile.listFiles(); for(File f:fileList){ if(f.isDirectory()){ continue; } //为每一个文件设置一个 输入流 inputStream=new FileInputStream(f); //设置压缩文件条目 zipOutputStream.putNextEntry(new ZipEntry(f.getName())); // byte[] bytes=new byte[1024]; int len=-1; while((len=inputStream.read(bytes))!=-1){ // 进行压缩 zipOutputStream.write(bytes,0,len); } } //关闭 zipOutputStream.close(); inputStream.close(); }else{ //是普通文件 inputStream=new FileInputStream(inFile); zipOutputStream.putNextEntry(new ZipEntry(inFile.getName())); byte[] bytes=new byte[1024]; int len=-1; while((len=inputStream.read(bytes))!=-1){ // 进行压缩 zipOutputStream.write(bytes,0,len); } //关闭 zipOutputStream.close(); inputStream.close(); } }
运行程序, 查看文件系统
有一个 a.zip 压缩文件,里面有那四个文件。