Java压缩技术(一) ZLib——Java原生实现

来源:互联网 发布:java策略模式的优点 编辑:程序博客网 时间:2024/05/17 03:56

可参考链接:http://snowolf.iteye.com/blog/642298

去年整理了一篇ZLib算法Java实现(Java压缩技术(一) ZLib),一直惦记却没时间补充。今天得空,整理一下ZIP的java原生实现。 
看了几篇zip压缩算法的帖子,讲的算是比较细致了,但就是没有对应的解压缩实现,太惜败了! 我就喜欢没事做总结,稍作整理,将其收纳! 

相关链接: 
Java压缩技术(一) ZLib 
Java压缩技术(二) ZIP压缩——Java原生实现 
Java压缩技术(三) ZIP解压缩——Java原生实现 
Java压缩技术(四) GZIP——Java原生实现 
Java压缩技术(五) GZIP相关——浏览器解析 
Java压缩技术(六) BZIP2——Commons实现 
Java压缩技术(七) TAR——Commons实现 

查过相关资料后才知道,ZIP应该算作归档类的压缩算法,每一门学科都可深可浅! 

闲言少叙,先说ZIP压缩。 
zip压缩需要通过ZipOutputStream 执行write方法将压缩数据写到指定输出流中。 
注意,这里应先使用CheckedOutputStream 指定文件校验算法。(通常使用CRC32算法)。代码如下所示: 

Java代码  收藏代码
  1. CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(destPath), new CRC32());  
  2. ZipOutputStream zos = new ZipOutputStream(cos);  

接下来,需要将待压缩文件以ZipEntry的方式追加到压缩文件中,如下所示: 
Java代码  收藏代码
  1.  /** 
  2.  * 压缩包内文件名定义 
  3.  *  
  4.  * <pre> 
  5.  * 如果有多级目录,那么这里就需要给出包含目录的文件名 
  6.  * 如果用WinRAR打开压缩包,中文名将显示为乱码 
  7.  * </pre> 
  8.  */  
  9. ZipEntry entry = new ZipEntry(dir + file.getName());  
  10.   
  11. zos.putNextEntry(entry);  

ZipEntry就是压缩包中的每一个实体! 
完成上述准备后,就可以执行压缩操作了。实际上,就是执行ZipOutputStream类的write方法,如下所示: 
Java代码  收藏代码
  1. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(  
  2.         file));  
  3.   
  4. int count;  
  5. byte data[] = new byte[BUFFER];  
  6. while ((count = bis.read(data, 0, BUFFER)) != -1) {  
  7.     zos.write(data, 0, count);  
  8. }  
  9. bis.close();  

当然,如果待添加的压缩项是一个目录。那么,需要通过递归的方式指定最终的压缩项。 
如果要添加一个空目录,注意使用符号"/"(String PATH="/";)作为添加项名字结尾符!