Java IO _ Zip 压缩流
来源:互联网 发布:海岛奇兵舰艇升级数据 编辑:程序博客网 时间:2024/06/06 02:52
今天在网上看到一遍关于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 java.io.OutputStream java.io.FilterOutputStream java.util.zip.DeflaterOutputStream java.util.zip.ZipOutputStream
从定义可以发现,就是一个字节的输出流。
public void putNextEntry(ZipEntry e) throws IOException
在压缩文件中,每一个压缩的内容都可以用一个ZipEntry 表示,所以在进行压缩之前必须通过putNextEntry 设置一个ZipEntry 即可。
- import java.io.File ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.util.zip.ZipEntry ;
- import java.util.zip.ZipOutputStream ;
- import java.io.FileOutputStream ;
- public class ZipOutputStreamDemo01{
- public staticvoid main(String args[]) throws Exception{// 所有异常抛出
- File file = new File("d:" + File.separator +"mldn.txt") ; // 定义要压缩的文件
- File zipFile = new File("d:" + File.separator +"mldn.zip") ; // 定义压缩文件名称
- InputStream input = new FileInputStream(file) ;// 定义文件的输入流
- ZipOutputStream zipOut = null ; // 声明压缩流对象
- zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
- zipOut.putNextEntry(new ZipEntry(file.getName())) ;// 设置ZipEntry对象
- zipOut.setComment("www.mldnjava.cn") ;// 设置注释
- int temp = 0 ;
- while((temp=input.read())!=-1){// 读取内容
- zipOut.write(temp) ; // 压缩输出
- }
- input.close() ; // 关闭输入流
- zipOut.close() ; // 关闭输出流
- }
- };
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.io.FileOutputStream ;public class ZipOutputStreamDemo01{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "mldn.txt") ;// 定义要压缩的文件File zipFile = new File("d:" + File.separator + "mldn.zip") ;// 定义压缩文件名称InputStream input = new FileInputStream(file) ;// 定义文件的输入流ZipOutputStream zipOut = null ;// 声明压缩流对象zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;zipOut.putNextEntry(new ZipEntry(file.getName())) ;// 设置ZipEntry对象zipOut.setComment("www.mldnjava.cn") ;// 设置注释int temp = 0 ;while((temp=input.read())!=-1){// 读取内容zipOut.write(temp) ;// 压缩输出}input.close() ;// 关闭输入流zipOut.close() ;// 关闭输出流}};
以上的操作代码完成的只是一个文件的压缩,如果要完成一个文件夹呢?
- import java.io.File ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.util.zip.ZipEntry ;
- import java.util.zip.ZipOutputStream ;
- import java.io.FileOutputStream ;
- public class ZipOutputStreamDemo02{
- public staticvoid main(String args[]) throws Exception{// 所有异常抛出
- File file = new File("d:" + File.separator +"mldn") ; // 定义要压缩的文件夹
- File zipFile = new File("d:" + File.separator +"mldndir.zip") ; // 定义压缩文件名称
- InputStream input = null ;// 定义文件输入流
- ZipOutputStream zipOut = null ; // 声明压缩流对象
- zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
- zipOut.setComment("www.mldnjava.cn") ;// 设置注释
- int temp = 0 ;
- if(file.isDirectory()){ // 判断是否是文件夹
- File lists[] = file.listFiles() ; // 列出全部文件
- for(int i=0;i<lists.length;i++){
- input = new FileInputStream(lists[i]) ;// 定义文件的输入流
- zipOut.putNextEntry(new ZipEntry(file.getName()
- +File.separator+lists[i].getName())) ; // 设置ZipEntry对象
- while((temp=input.read())!=-1){// 读取内容
- zipOut.write(temp) ; // 压缩输出
- }
- input.close() ; // 关闭输入流
- }
- }
- zipOut.close() ; // 关闭输出流
- }
- };
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.io.FileOutputStream ;public class ZipOutputStreamDemo02{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "mldn") ;// 定义要压缩的文件夹File zipFile = new File("d:" + File.separator + "mldndir.zip") ;// 定义压缩文件名称InputStream input = null ;// 定义文件输入流ZipOutputStream zipOut = null ;// 声明压缩流对象zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;zipOut.setComment("www.mldnjava.cn") ;// 设置注释int temp = 0 ;if(file.isDirectory()){// 判断是否是文件夹File lists[] = file.listFiles() ;// 列出全部文件for(int i=0;i<lists.length;i++){input = new FileInputStream(lists[i]) ;// 定义文件的输入流zipOut.putNextEntry(new ZipEntry(file.getName()+File.separator+lists[i].getName())) ;// 设置ZipEntry对象while((temp=input.read())!=-1){// 读取内容zipOut.write(temp) ;// 压缩输出}input.close() ;// 关闭输入流}}zipOut.close() ;// 关闭输出流}};
3.2 ZipFile
是一个专门表示压缩文件的类。
ZipFile 在实例化的时候必须接收File 类的实例。此File 类的实例是指向一个压缩 *.zip 文件。
第一步:为 ZipFile 实例化
实例化时需要接收File 类的引用
- import java.io.File ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.util.zip.ZipEntry ;
- import java.util.zip.ZipOutputStream ;
- import java.util.zip.ZipFile ;
- import java.io.FileOutputStream ;
- public class ZipFileDemo01{
- public staticvoid main(String args[]) throws Exception{// 所有异常抛出
- File file = new File("d:" + File.separator +"mldn.zip") ; // 找到压缩文件
- ZipFile zipFile = new ZipFile(file) ;// 实例化ZipFile对象
- System.out.println("压缩文件的名称:" + zipFile.getName()) ;// 得到压缩文件的名称
- }
- };
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.util.zip.ZipFile ;import java.io.FileOutputStream ;public class ZipFileDemo01{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "mldn.zip") ;// 找到压缩文件ZipFile zipFile = new ZipFile(file) ;// 实例化ZipFile对象System.out.println("压缩文件的名称:" + zipFile.getName()) ;// 得到压缩文件的名称}};
通过ZipFile 文件,为mldn.zip 进行解压缩操作。
- import java.io.File ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.util.zip.ZipEntry ;
- import java.util.zip.ZipOutputStream ;
- import java.io.FileOutputStream ;
- public class ZipOutputStreamDemo02{
- public staticvoid main(String args[]) throws Exception{// 所有异常抛出
- File file = new File("d:" + File.separator +"mldn") ; // 定义要压缩的文件夹
- File zipFile = new File("d:" + File.separator +"mldndir.zip") ; // 定义压缩文件名称
- InputStream input = null ;// 定义文件输入流
- ZipOutputStream zipOut = null ; // 声明压缩流对象
- zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;
- zipOut.setComment("www.mldnjava.cn") ;// 设置注释
- int temp = 0 ;
- if(file.isDirectory()){ // 判断是否是文件夹
- File lists[] = file.listFiles() ; // 列出全部文件
- for(int i=0;i<lists.length;i++){
- input = new FileInputStream(lists[i]) ;// 定义文件的输入流
- zipOut.putNextEntry(new ZipEntry(file.getName()
- +File.separator+lists[i].getName())) ; // 设置ZipEntry对象
- while((temp=input.read())!=-1){// 读取内容
- zipOut.write(temp) ; // 压缩输出
- }
- input.close() ; // 关闭输入流
- }
- }
- zipOut.close() ; // 关闭输出流
- }
- };
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.io.FileOutputStream ;public class ZipOutputStreamDemo02{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "mldn") ;// 定义要压缩的文件夹File zipFile = new File("d:" + File.separator + "mldndir.zip") ;// 定义压缩文件名称InputStream input = null ;// 定义文件输入流ZipOutputStream zipOut = null ;// 声明压缩流对象zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;zipOut.setComment("www.mldnjava.cn") ;// 设置注释int temp = 0 ;if(file.isDirectory()){// 判断是否是文件夹File lists[] = file.listFiles() ;// 列出全部文件for(int i=0;i<lists.length;i++){input = new FileInputStream(lists[i]) ;// 定义文件的输入流zipOut.putNextEntry(new ZipEntry(file.getName()+File.separator+lists[i].getName())) ;// 设置ZipEntry对象while((temp=input.read())!=-1){// 读取内容zipOut.write(temp) ;// 压缩输出}input.close() ;// 关闭输入流}}zipOut.close() ;// 关闭输出流}};
以上的操作中,有一个问题,必须知道压缩文件中的每一个压缩实体的名称才可以进行解压缩操作,而如果现在在假设是一个文件夹呢?
3、ZipInputStream
定义:
java.lang.Object java.io.InputStream java.io.FilterInputStream java.util.zip.InflaterInputStream java.util.zip.ZipInputStream
- import java.io.File ;
- import java.io.FileInputStream ;
- import java.io.InputStream ;
- import java.util.zip.ZipEntry ;
- import java.util.zip.ZipInputStream ;
- import java.io.FileInputStream ;
- public class ZipInputStreamDemo01{
- public staticvoid main(String args[]) throws Exception{// 所有异常抛出
- File zipFile = new File("d:" + File.separator +"mldn.zip") ; // 定义压缩文件名称
- ZipInputStream input = null ; // 定义压缩输入流
- input = new ZipInputStream(new FileInputStream(zipFile)) ;// 实例化ZIpInputStream
- ZipEntry entry = input.getNextEntry() ; // 得到一个压缩实体
- System.out.println("压缩实体名称:" + entry.getName()) ;
- input.close() ;
- }
- };
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipInputStream ;import java.io.FileInputStream ;public class ZipInputStreamDemo01{public static void main(String args[]) throws Exception{// 所有异常抛出File zipFile = new File("d:" + File.separator + "mldn.zip") ;// 定义压缩文件名称ZipInputStream input = null ;// 定义压缩输入流input = new ZipInputStream(new FileInputStream(zipFile)) ;// 实例化ZIpInputStreamZipEntry entry = input.getNextEntry() ;// 得到一个压缩实体System.out.println("压缩实体名称:" + entry.getName()) ;input.close() ;}};
利用此特性并结合 ZipFile 就可以完成解压缩文件夹的功能。
ZipFile 对象,可以找到每一个ZipEntry 的输入流。但是ZipInputStream 并不能得到每一个输入流,所以需要使用ZipFile,但是ZipInputStream 在取得每一个ZipEntry 的时候,不需要每一个ZipEntry 的时候,不需要每一个ZipEntry 的名称。
- import java.io.File ;
- import java.io.OutputStream ;
- import java.io.InputStream ;
- import java.util.zip.ZipEntry ;
- import java.util.zip.ZipFile ;
- import java.util.zip.ZipInputStream ;
- import java.io.FileInputStream ;
- import java.io.FileOutputStream ;
- public class ZipInputStreamDemo02{
- public staticvoid main(String args[]) throws Exception{// 所有异常抛出
- File file = new File("d:" + File.separator +"mldndir.zip") ; // 定义压缩文件名称
- File outFile = null ; // 输出文件的时候要有文件夹的操作
- ZipFile zipFile = new ZipFile(file) ;// 实例化ZipFile对象
- ZipInputStream zipInput = null ; // 定义压缩输入流
- OutputStream out = null ;// 定义输出流,用于输出每一个实体内容
- InputStream input = null ; // 定义输入流,读取每一个ZipEntry
- ZipEntry entry = null ; // 每一个压缩实体
- zipInput = new ZipInputStream(new FileInputStream(file)) ;// 实例化ZIpInputStream
- while((entry = zipInput.getNextEntry())!=null){// 得到一个压缩实体
- System.out.println("解压缩" + entry.getName() +"文件。") ;
- outFile = new File("d:" + File.separator + entry.getName()) ;// 定义输出的文件路径
- if(!outFile.getParentFile().exists()){// 如果输出文件夹不存在
- outFile.getParentFile().mkdir() ; // 创建文件夹
- }
- if(!outFile.exists()){ // 判断输出文件是否存在
- outFile.createNewFile() ; // 创建文件
- }
- input = zipFile.getInputStream(entry) ; // 得到每一个实体的输入流
- out = new FileOutputStream(outFile) ;// 实例化文件输出流
- int temp = 0 ;
- while((temp=input.read())!=-1){
- out.write(temp) ;
- }
- input.close() ; // 关闭输入流
- out.close() ; // 关闭输出流
- }
- input.close() ;
- }
- };
import java.io.File ;import java.io.OutputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipFile ;import java.util.zip.ZipInputStream ;import java.io.FileInputStream ;import java.io.FileOutputStream ;public class ZipInputStreamDemo02{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "mldndir.zip") ;// 定义压缩文件名称File outFile = null ;// 输出文件的时候要有文件夹的操作ZipFile zipFile = new ZipFile(file) ;// 实例化ZipFile对象ZipInputStream zipInput = null ;// 定义压缩输入流OutputStream out = null ;// 定义输出流,用于输出每一个实体内容InputStream input = null ;// 定义输入流,读取每一个ZipEntryZipEntry entry = null ;// 每一个压缩实体zipInput = new ZipInputStream(new FileInputStream(file)) ;// 实例化ZIpInputStreamwhile((entry = zipInput.getNextEntry())!=null){// 得到一个压缩实体System.out.println("解压缩" + entry.getName() + "文件。") ;outFile = new File("d:" + File.separator + entry.getName()) ;// 定义输出的文件路径if(!outFile.getParentFile().exists()){// 如果输出文件夹不存在outFile.getParentFile().mkdir() ;// 创建文件夹}if(!outFile.exists()){// 判断输出文件是否存在outFile.createNewFile() ;// 创建文件}input = zipFile.getInputStream(entry) ;// 得到每一个实体的输入流out = new FileOutputStream(outFile) ;// 实例化文件输出流int temp = 0 ;while((temp=input.read())!=-1){out.write(temp) ;}input.close() ;// 关闭输入流out.close() ;// 关闭输出流}input.close() ;}};
如果目录不存在,则应该进行创建操作。
总结:
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 压缩流
- Java IO _压缩流
- Java IO _压缩流
- Java IO _压缩流
- Java IO _压缩流
- Java IO _压缩流
- Java IO流 Zip文件的压缩和好压缩
- 【JAVA IO】_压缩流笔记
- 【JAVA IO】_压缩流笔记
- 【Java】IO操作之使用zip包压缩和解压缩文件
- Java IO系列(四):文件压缩GZIP、Zip
- Java IO 压缩流
- java IO压缩流
- java IO 压缩流
- java 解压缩zip 压缩zip
- java Zip压缩输入输出流问题
- Java Zip压缩
- java 压缩zip
- 设计模式六大原则6—开闭原则
- C#代表类型(delegate)
- 你的身边有没有友元朋友?
- java代理模式
- 游戏引擎十大核心竞争力
- Java IO _ Zip 压缩流
- Java新浪微博客户端开发第二步
- oracle异构rman迁移
- Android 4.0 Launcher2源码分析——桌面快捷图标的拖拽
- hdu,2050,折线分割平面
- 给C++初学者的50个忠告
- easyUI 自定义window工具
- uva 110 - Meta-Loopless Sorts
- 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库