Java 原生API


java.util.zip.* 支持读写压缩格式的压缩流,可以使用它们对其他I/O进行封装,以提供压缩功能;

这些类是属于InputStream和OUtputStream继承层次的一部分,这是因为压缩类库是按字节而不是按字符来处理的;(不过可使用InputStream和OutputStreamWriter完成对Reader和Writer的转型);

压缩算法有很多种,但是一般最常用的是ZIP和GZIP;

使用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进行多文件保存

支持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());  
}