`
yidongkaifa
  • 浏览: 4064150 次
文章分类
社区版块
存档分类
最新评论

Java IO _ Zip 压缩流

 
阅读更多

今天在网上看到一遍关于Zip压缩流,感觉写的非常不错,图文并茂本人佩服五体投低啊,呵呵。好东西,先转载过来呢。

原遍地址:http://blog.csdn.net/hanshileiai/article/details/6718375

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、了解压缩流的主要作用

2、了解JAVA IO 支持的三种压缩格式

3、掌握ZipOutputStream、ZipFile、ZipInputStream 三个类的作用

具体内容

经常可以看见各种压缩文件:zip、jar、GZ、



正常情况下在IO 操作中,所有的类库都是在 IO 包中。


在实例化ZipEntry 的时候,要设置名称,此名称实际上就是压缩文件中每一个元素的名称。

1、ZipOutputStream


此类的功能就是完成ZIP格式输出的。

继承关系:

java.lang.Object
  extended by java.io.OutputStream
      extended by java.io.FilterOutputStream
          extended by java.util.zip.DeflaterOutputStream
              extended by java.util.zip.ZipOutputStream

从定义可以发现,就是一个字节的输出流。

public void putNextEntry(ZipEntry e)
                  throws IOException

在压缩文件中,每一个压缩的内容都可以用一个ZipEntry 表示,所以在进行压缩之前必须通过putNextEntry 设置一个ZipEntry 即可。

  1. import java.io.File ;
  2. import java.io.FileInputStream ;
  3. import java.io.InputStream ;
  4. import java.util.zip.ZipEntry ;
  5. import java.util.zip.ZipOutputStream ;
  6. import java.io.FileOutputStream ;
  7. public class ZipOutputStreamDemo01{
  8. public static void main(String args[]) throws Exception{ // 所有异常抛出
  9. File file = new File("d:" + File.separator + "mldn.txt") ; // 定义要压缩的文件
  10. File zipFile = new File("d:" + File.separator + "mldn.zip") ; // 定义压缩文件名称
  11. InputStream input = new FileInputStream(file) ; // 定义文件的输入流
  12. ZipOutputStream zipOut = null ; // 声明压缩流对象
  13. zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
  14. zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 设置ZipEntry对象
  15. zipOut.setComment("www.mldnjava.cn") ; // 设置注释
  16. int temp = 0 ;
  17. while((temp=input.read())!=-1){ // 读取内容
  18. zipOut.write(temp) ; // 压缩输出
  19. }
  20. input.close() ; // 关闭输入流
  21. zipOut.close() ; // 关闭输出流
  22. }
  23. };

以上的操作代码完成的只是一个文件的压缩,如果要完成一个文件夹呢?


  1. import java.io.File ;
  2. import java.io.FileInputStream ;
  3. import java.io.InputStream ;
  4. import java.util.zip.ZipEntry ;
  5. import java.util.zip.ZipOutputStream ;
  6. import java.io.FileOutputStream ;
  7. public class ZipOutputStreamDemo02{
  8. public static void main(String args[]) throws Exception{ // 所有异常抛出
  9. File file = new File("d:" + File.separator + "mldn") ; // 定义要压缩的文件夹
  10. File zipFile = new File("d:" + File.separator + "mldndir.zip") ; // 定义压缩文件名称
  11. InputStream input = null ; // 定义文件输入流
  12. ZipOutputStream zipOut = null ; // 声明压缩流对象
  13. zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
  14. zipOut.setComment("www.mldnjava.cn") ; // 设置注释
  15. int temp = 0 ;
  16. if(file.isDirectory()){ // 判断是否是文件夹
  17. File lists[] = file.listFiles() ; // 列出全部文件
  18. for(int i=0;i<lists.length;i++){
  19. input = new FileInputStream(lists[i]) ; // 定义文件的输入流
  20. zipOut.putNextEntry(new ZipEntry(file.getName()
  21. +File.separator+lists[i].getName())) ; // 设置ZipEntry对象
  22. while((temp=input.read())!=-1){ // 读取内容
  23. zipOut.write(temp) ; // 压缩输出
  24. }
  25. input.close() ; // 关闭输入流
  26. }
  27. }
  28. zipOut.close() ; // 关闭输出流
  29. }
  30. };

3.2 ZipFile

是一个专门表示压缩文件的类。

ZipFile 在实例化的时候必须接收File 类的实例。此File 类的实例是指向一个压缩 *.zip 文件。

第一步:为 ZipFile 实例化

实例化时需要接收File 类的引用

  1. import java.io.File ;
  2. import java.io.FileInputStream ;
  3. import java.io.InputStream ;
  4. import java.util.zip.ZipEntry ;
  5. import java.util.zip.ZipOutputStream ;
  6. import java.util.zip.ZipFile ;
  7. import java.io.FileOutputStream ;
  8. public class ZipFileDemo01{
  9. public static void main(String args[]) throws Exception{ // 所有异常抛出
  10. File file = new File("d:" + File.separator + "mldn.zip") ; // 找到压缩文件
  11. ZipFile zipFile = new ZipFile(file) ; // 实例化ZipFile对象
  12. System.out.println("压缩文件的名称:" + zipFile.getName()) ; // 得到压缩文件的名称
  13. }
  14. };

通过ZipFile 文件,为mldn.zip 进行解压缩操作。

  1. import java.io.File ;
  2. import java.io.FileInputStream ;
  3. import java.io.InputStream ;
  4. import java.util.zip.ZipEntry ;
  5. import java.util.zip.ZipOutputStream ;
  6. import java.io.FileOutputStream ;
  7. public class ZipOutputStreamDemo02{
  8. public static void main(String args[]) throws Exception{ // 所有异常抛出
  9. File file = new File("d:" + File.separator + "mldn") ; // 定义要压缩的文件夹
  10. File zipFile = new File("d:" + File.separator + "mldndir.zip") ; // 定义压缩文件名称
  11. InputStream input = null ; // 定义文件输入流
  12. ZipOutputStream zipOut = null ; // 声明压缩流对象
  13. zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
  14. zipOut.setComment("www.mldnjava.cn") ; // 设置注释
  15. int temp = 0 ;
  16. if(file.isDirectory()){ // 判断是否是文件夹
  17. File lists[] = file.listFiles() ; // 列出全部文件
  18. for(int i=0;i<lists.length;i++){
  19. input = new FileInputStream(lists[i]) ; // 定义文件的输入流
  20. zipOut.putNextEntry(new ZipEntry(file.getName()
  21. +File.separator+lists[i].getName())) ; // 设置ZipEntry对象
  22. while((temp=input.read())!=-1){ // 读取内容
  23. zipOut.write(temp) ; // 压缩输出
  24. }
  25. input.close() ; // 关闭输入流
  26. }
  27. }
  28. zipOut.close() ; // 关闭输出流
  29. }
  30. };

以上的操作中,有一个问题,必须知道压缩文件中的每一个压缩实体的名称才可以进行解压缩操作,而如果现在在假设是一个文件夹呢?
3、ZipInputStream

定义:

java.lang.Object
  extended by java.io.InputStream
      extended by java.io.FilterInputStream
          extended by java.util.zip.InflaterInputStream
              extended by java.util.zip.ZipInputStream

  1. import java.io.File ;
  2. import java.io.FileInputStream ;
  3. import java.io.InputStream ;
  4. import java.util.zip.ZipEntry ;
  5. import java.util.zip.ZipInputStream ;
  6. import java.io.FileInputStream ;
  7. public class ZipInputStreamDemo01{
  8. public static void main(String args[]) throws Exception{ // 所有异常抛出
  9. File zipFile = new File("d:" + File.separator + "mldn.zip") ; // 定义压缩文件名称
  10. ZipInputStream input = null ; // 定义压缩输入流
  11. input = new ZipInputStream(new FileInputStream(zipFile)) ; // 实例化ZIpInputStream
  12. ZipEntry entry = input.getNextEntry() ; // 得到一个压缩实体
  13. System.out.println("压缩实体名称:" + entry.getName()) ;
  14. input.close() ;
  15. }
  16. };

利用此特性并结合 ZipFile 就可以完成解压缩文件夹的功能。

ZipFile 对象,可以找到每一个ZipEntry 的输入流。但是ZipInputStream 并不能得到每一个输入流,所以需要使用ZipFile,但是ZipInputStream 在取得每一个ZipEntry 的时候,不需要每一个ZipEntry 的时候,不需要每一个ZipEntry 的名称。

  1. import java.io.File ;
  2. import java.io.OutputStream ;
  3. import java.io.InputStream ;
  4. import java.util.zip.ZipEntry ;
  5. import java.util.zip.ZipFile ;
  6. import java.util.zip.ZipInputStream ;
  7. import java.io.FileInputStream ;
  8. import java.io.FileOutputStream ;
  9. public class ZipInputStreamDemo02{
  10. public static void main(String args[]) throws Exception{ // 所有异常抛出
  11. File file = new File("d:" + File.separator + "mldndir.zip") ; // 定义压缩文件名称
  12. File outFile = null ; // 输出文件的时候要有文件夹的操作
  13. ZipFile zipFile = new ZipFile(file) ; // 实例化ZipFile对象
  14. ZipInputStream zipInput = null ; // 定义压缩输入流
  15. OutputStream out = null ; // 定义输出流,用于输出每一个实体内容
  16. InputStream input = null ; // 定义输入流,读取每一个ZipEntry
  17. ZipEntry entry = null ; // 每一个压缩实体
  18. zipInput = new ZipInputStream(new FileInputStream(file)) ; // 实例化ZIpInputStream
  19. while((entry = zipInput.getNextEntry())!=null){ // 得到一个压缩实体
  20. System.out.println("解压缩" + entry.getName() + "文件。") ;
  21. outFile = new File("d:" + File.separator + entry.getName()) ; // 定义输出的文件路径
  22. if(!outFile.getParentFile().exists()){ // 如果输出文件夹不存在
  23. outFile.getParentFile().mkdir() ; // 创建文件夹
  24. }
  25. if(!outFile.exists()){ // 判断输出文件是否存在
  26. outFile.createNewFile() ; // 创建文件
  27. }
  28. input = zipFile.getInputStream(entry) ; // 得到每一个实体的输入流
  29. out = new FileOutputStream(outFile) ; // 实例化文件输出流
  30. int temp = 0 ;
  31. while((temp=input.read())!=-1){
  32. out.write(temp) ;
  33. }
  34. input.close() ; // 关闭输入流
  35. out.close() ; // 关闭输出流
  36. }
  37. input.close() ;
  38. }
  39. };

如果目录不存在,则应该进行创建操作。

总结:

1、压缩文件中的每一个压缩实体都使用ZipEntry 保存,一个压缩文件中可能包含一个或多个的ZipEntry 对象。

2、在JAVA中可以进行zip、jar、gz、三种格式的压缩支持,操作流程基本上是一样的

3、ZipOutputStream 可以进行压缩输出,但是输出的位置不一定是文件。

4、ZipFile 表示每一个压缩文件,可以得到每一个压缩实体的输入流

5、ZipInputStream 可以得到每一个实体,但是却无法得到每一个实体的输入流。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

再次感谢作者贡献如此美妙的文章,有兴趣的读者请参考原遍,原遍地址:http://blog.csdn.net/hanshileiai/article/details/6718375

分享到:
评论

相关推荐

    Java IO流 Zip文件的压缩和解压缩

    NULL 博文链接:https://beijishiqidu.iteye.com/blog/1944225

    java将文件夹压缩成zip,解压zip压缩包

    java控制指定路径下的文件夹压缩成zip格式。 java将zip压缩包解压成为文件夹。直接使用io流进行操作,不需借助其他jar包

    java zip压缩解压工具解决中文乱码问题

    使用java压缩也解压zip文件方法,解决中文乱码问题。使用java自带的压缩解压算法,会出现中文乱码问题。使用apache io的zip包,有效解决该问题。Ant的压缩解压,也是使用该类。

    java算法,实现压缩及解压缩

    Java实现压缩与解压缩ZIP  import java.io.BufferedInputStream;  import java.io.BufferedOutputStream;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileOutputStream;...

    Java开发详解.zip

    031214_【第12章:JAVA IO】_压缩流笔记.pdf 031215_【第12章:JAVA IO】_回退流笔记.pdf 031216_【第12章:JAVA IO】_字符编码笔记.pdf 031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗...

    java压缩中文处理使用org.apache.tools.zip已经打包成jar

    java压缩中文处理使用org.apache.tools.zip已经打包成jar 只要放在LIB文件夹下,然后在JSP 或 JAVA 里引用即可。 &lt;%@ page language="java" import="java.sql.*,java.io.*,org.apache.tools.zip.Zip" pageEncoding=...

    Java高手真经(编程基础卷)光盘全部源码

    javaio.zip 09.Java输入/输出流 javavi.zip 09.Java输入/输出流上机作业参考(文本编辑器) javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14...

    Java实现文件的压缩和解压

    基于GUI用IO流中的ZipOutputStream ,ZipInputStream实现文件的解压与压缩, 如文件解压函数如下 private void unZip(String zipFileName, String outputDirectory)throws Exception { InputStream in=null; ...

    使用java压缩zip文件

    使用java.io.zip包实现压缩一个文件夹下所有内容。

    Android实现下载zip压缩文件并解压的方法(附源码)

    其实在网上有很多介绍下载文件或者解压zip文件的文章,但是两者结合的不多,所以这篇文章在此记录一下下载zip文件并直接解压的方法,直接上代码,文末有源码下载。 下载: import java.io.BufferedInputStream; ...

    java压缩文件源码--ZipUtils

    import java.io.*; import java.util.*; import java.util.zip.Adler32; import java.util.zip.CheckedInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip....

    java-io-guide:Java中的Java IO(输入和输出流)指南

    这是Java中文件处理的完整指南。...从Java中的ZIP文件解压缩文件 目录 目录操作示例列表。 获取当前工作目录 建立目录 删除目录 复制目录 遍历/列出目录结构 检查目录是否为空 文件实用程序 Java F

    Java源码包100个设计实例.zip

    Java二进制IO类与文件复制操作实例.rar Java从压缩包中提取文件.rar Java从网络取得文件.rar Java仓库管理系统,Access数据库.rar Java仿Vista界面风格的登录窗口.rar Java仿千千静听音乐播放器源代码.rar Java企业...

    java压缩使用org.apache.tools.zip包解决中文文件名

    java.io.File zipfile =new java.io.File(zipf); java.io.File[] srcfile=new java.io.File[20]; //自己把要压缩的文件加进去 int m=0; //---------压缩包中文件的个数-------------- byte[] buf=new byte[1024];...

    导出zip前后端完整方法

    里面封装了压缩文件及文件夹的方法,还有以流的形式下载到前端的方法以及删除目录等常用方法,还有前端的下载方法

    org.apache.tools.zip解决解压乱码问题

    * @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 * void */ public static void unzip(String zipFilePath, String targetPath) throws ...

    Java试下制定文件的复制,压缩功能

    Java试下制定文件的复制,压缩功能,类中方法有制定文件的复制,及对制定文件下所有文件的制定位置压缩,生成压缩zip文件

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    commons-io-2.6.zip jar包

    压缩,使文件变小,与ZIP压缩机制完全相同。 包封装。能够让JAR包里面的文件依赖于统一版本的类文件。 可移植性,能够在各种平台上直接使用。 把一个JAR文件添加到系统的classpath环境变量之后,java通常会把这个...

Global site tag (gtag.js) - Google Analytics