在日常的使用中经常会使用 WinRAR 或者 WinZIP 等压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输,在Java 中为了减少传输时的数据量也提供了专门的压缩流,可以将文件夹压缩成 ZIP、JAR、GZIP 等文件形式。
一、ZIP 压缩输入/输出流简介
在 Java 中要实现ZIP的压缩需要导入 java.util.zip包。
在每一个压缩文件中都会存在多个子文件,那么每一个子文件在 Java 中就使用 ZipEntry表示,ZipEntry 类的常用方法:
压缩的输入/输出类定义在 java.util.zip 包中,压缩的输入/输出流也属于 InputStream 或 OutputStream 的子类,但是却没有定义在java.io 包中,而是以一种工具类的形式提供,在操作时还需要使用 java.io 包的支持
二、ZipOutputStream 类
如果要完成一个文件或文件夹的压缩,需要使用 ZipOutputStream 类。ZipOutputStream 是 OutputStream 的子类,常用方法:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Test{
public static void main(String[] args) throws Exception{//抛出所有异常
//定义要压缩的文件
File file = new File("D:" + File.separator + "test.txt");
//定义压缩文件名称
File zipFile = new File("D:" + File.separator + "test.zip");
InputStream input = new FileInputStream(file);//定义输入文件流
ZipOutputStream zipOut = null;//定义压缩输出流
//实例化压缩输出流对象,并指定压缩文件的输出路径
zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
//每一个被压缩的文件都用 ZipEntry 表示,需要为每一个压缩后的文件设置名称
zipOut.putNextEntry(new ZipEntry(file.getName()));//创建 ZipEntry
zipOut.setComment("Java");//设置注释
int temp =0;
while ((temp = input.read())!=-1){//读取内容
zipOut.write(temp);//压缩输出内容
}
input.close();//关闭输入流
zipOut.close();//关闭压缩输出流
}
}
这里将 test.txt 作为源文件,然后使用 ZipOutputStream 将所有的压缩数据输出到 test.zip 文件中,在压缩时采用了边读边写的方式完成
这里通过使用 ZipOutputStream 读取 ZIP 格式的压缩文件,然后通过 getNextEntry() 方法依次读取出其中每一个 ZipEntry 对象的名称,并通过 ZipFile 类取得每一个 ZIPEntry 的输入流对象,在进行文件输出前,判断其输出文件夹以及文件是否存在,如果不存在则创建。