java.util.zip.* 支持读写压缩格式的压缩流,可以使用它们对其他I/O进行封装,以提供压缩功能;
这些类是属于InputStream和OUtputStream继承层次的一部分,这是因为压缩类库是按字节而不是按字符来处理的;(不过可使用InputStream和OutputStreamWriter完成对Reader和Writer的转型);
压缩算法有很多种,但是一般最常用的是ZIP和GZIP;
压缩
//待压缩文件
BufferedReader in = new BufferedReader(new FileReader("src/file.txt"));
BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("gzip compressed file.gz")));
int temp;
while((temp = in.read()) != null)
out.write(temp);
//从待压缩文件读取数据后写入到GZIP压缩输出流
in.close();
out.close();
解压
//待解压文件
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream("gzip compressed file.gz")));
BufferedWriter out = new BufferedWriter(new FileWriter("gzip decompressed file.txt"));
String s;
while((s = in.readLine()) != null){
out.write(s);
out.newLine();
}
支持ZIp的Java类库更加全面,可以利用java.util.zip中的ZipOutputStream、ZipInputStream、ZipFile等对多个文件进行压缩和解压;
Java支持的Checksunm类型:Adler32(速度较快),CRC32(速度较慢,准确率更高);
压缩多个文件
public ZIPconpress(String...filenames){
//构建zip压缩写入流装饰器,使用显式装饰是因为其中多个装饰器要直接使用它们的性质;
FileOutputStream f = new FileOutputStream("zip compressed file.zip");
//用于加入验证和的属性
CheckOutputStream csum = new CheckOUtputStream(f,new Adler23());
//加入压缩输出流的属性;
ZipOutputStream zos = new ZipOutputStream(csum);
BufferedOutputStream out = new bufferedOuputStream(zos);
//设置zip文件注解
zos.setComment("A test of Java Zipping.");
for(String filename : filenames){
BufferedReader in = new BufferedReader(new FileInputReader(filename));
//在压缩文件中设置一个新的zip条目,并将流定位到该条目数据的开始处;
zos.putNextEntry(new ZIpEntry(filename));
int c;
//从每一个文件读取数据,并写入到压缩文件中;
while((c = in.read())!=null)
out.write(c);
in.close();
//刷新该输出流,并强制写出所有缓冲区的输出字节;
out.flush();
}
out.close();
//返回验证和
System.out.println(csum.getChecksum().getValue());
}