Java IO操作——掌握压缩流的使用(ZipOutputStream、ZipFile、ZipInputStream)[java.util包中]
来源:互联网 发布:程序员在银行干什么 编辑:程序博客网 时间:2024/05/20 15:37
学习目标
了解压缩流的主要作用
了解JAVA IO支持的三种压缩格式
掌握ZipOutputStream、ZipFile、ZipInputStream三个类的使用
压缩文件大致可以分为三种:ZIP、JAR、GZ
压缩流
在日常的使用中经常会使用到像WinRAR或WinZIP这样的压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输。
在JAVA中 为了减少传输时的数据量也提供了专门的压缩流,可以将文件或文件夹压缩成ZIP、JAR、GZIP等文件的格式。
压缩流的实现
ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。
JAR及GZIP文件格式的压缩输入、输出流:
在JAVA IO中,不仅可以实现ZIP压缩格式的输入、输出,也可以实现JAR及GZIP文件格式的压缩:
JAR压缩的支持类保存在java.util.jar包中,常用的类有如下几个:
JAR压缩输出流:JarOutputStream
JAR压缩输入流:JarInputStream
JAR文件:JARFile
JAR实体:JAREntry
GZIP是用于UNIX系统的文件压缩,在Linux中经常会使用到*.gz的文件,就是GZIP格式,GZIP压缩的支持类保存在java.util.zip包中,常用的类有如下几个:
GZIP压缩输出流:GZIPOutputStream
GZIP压缩输入流:GZIPInputStream
正常情况下在IO操作中,所有的类库都是在io包中。
ZipEntry:
在每一个压缩文件中都会存在多个子文件,那么这每一个的子文件在JAVA中就使用ZipEntry表示。
ZipEntry类的常用方法:
public ZipEntry(String name) 构造方法 创建对象并指定要创建的ZipEntry名称。
public boolean isDirectory() 普通方法 判断ZipEntry是否是目录。
在实例化ZipEntry的时候,要设置名称,此名称实际上就是压缩文件中的每一个元素中的名称。
ZipOutputStream:
如果要想完成一个文件或文件夹的压缩,要使用ZipOutputStream类完成,ZipOutputStream是OutputStream的子类。
public ZipOutputStream(OutputStream out) 构造方法 创建新的ZIP输出流。
public void putNextEntry(ZipEntry e) throws IOException 普通方法 设置每一个ZipEntry对象。
public void setComment(String comment) 设置ZIP文件的注释
此类的功能就是完成ZIP格式输出的。继承关系如下:
从定义中可以看出,其实就是一个字节的输出流。
在压缩文件中,每一个压缩的内容都可以用一个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 static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "liuxun.txt") ;// 定义要压缩的文件File zipFile = new File("d:" + File.separator + "liuxun.zip") ;// 定义压缩文件名称InputStream input = new FileInputStream(file) ;// 定义文件的输入流ZipOutputStream zipOut = null ;// 声明压缩流对象zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;zipOut.putNextEntry(new ZipEntry(file.getName())) ;// 设置ZipEntry对象zipOut.setComment("压缩流测试") ;// 设置注释int temp = 0 ;while((temp=input.read())!=-1){// 读取内容zipOut.write(temp) ;// 压缩输出}input.close() ;// 关闭输入流zipOut.close() ;// 关闭输出流}};
压缩一个非嵌套型文件夹
以上是对一个文件进行压缩,但是在日常的开发中,往往需要对一个文件夹进行压缩,例如,现在在某盘存在一个liuxun的文件夹。从使用各种压缩软件的经验来看,如果现在要进行压缩的话,则在压缩之后的文件中应该存在一个liuxun的文件夹。在文件夹中应该存放着各个压缩文件。所以在实现的时候就应该列出文件夹中的全部内容,并把每一个内容设置成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 ZipOutputStreamDemo02{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "liuxun") ;// 定义要压缩的文件夹File zipFile = new File("d:" + File.separator + "liuxundir.zip") ;// 定义压缩文件名称InputStream input = null ;// 定义文件输入流ZipOutputStream zipOut = null ;// 声明压缩流对象zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;zipOut.setComment("liuxunTEST") ;// 设置注释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("/Users/liuxun/Downloads/liuxun") ;// 定义要压缩的文件夹File zipFile = new File("/Users/liuxun/Downloads/liuxundir.zip") ;// 定义压缩文件名称zipMultiFile("/Users/liuxun/Downloads/liuxun", "/Users/liuxun/Downloads/liuxundir.zip", true);}/* * 压缩整个文件夹中的所有文件,生成指定名称的zip压缩包 * @param filepath 文件所在目录 * @param zippath 压缩后zip文件名称 * @param dirFlag zip文件中第一层是否包含一级目录,true包含;false没有 * 2015年6月9日 */ public static void zipMultiFile(String filepath ,String zippath, boolean dirFlag) { try { File file = new File(filepath);// 要被压缩的文件夹 File zipFile = new File(zippath); ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile)); if(file.isDirectory()){ File[] files = file.listFiles(); for(File fileSec:files){ if(dirFlag){ recursionZip(zipOut, fileSec, file.getName() + File.separator); }else{ recursionZip(zipOut, fileSec, ""); } } } zipOut.close(); } catch (Exception e) { e.printStackTrace(); } } private static void recursionZip(ZipOutputStream zipOut, File file, String baseDir) throws Exception{ if(file.isDirectory()){ File[] files = file.listFiles(); for(File fileSec:files){ recursionZip(zipOut, fileSec, baseDir + file.getName() + File.separator); } }else{ byte[] buf = new byte[1024]; InputStream input = new FileInputStream(file); zipOut.putNextEntry(new ZipEntry(baseDir + file.getName())); int len; while((len = input.read(buf)) != -1){ zipOut.write(buf, 0, len); } input.close(); } }};
ZipFile
是一个专门表示压缩文件的类,在JAVA中,每一个压缩文件都可以使用ZipFile表示,还可以使用ZipFile根据压缩后的文件名称找到每一个压缩文件中的ZipEntry并将其进行解压缩操作。
1、public ZipFile(File file) throws ZipException,IOException 构造方法 根据File类实例化ZipFile对象。
2、public ZipEntry getEntry(String name) 根据名称找到其对应的ZipEntry。
3、public InputStream getInputStream(ZipEntry entry) throws IOException 根据ZipEntry取得InputStream对象。
4、public String getName() 得到压缩文件的路径名称。
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 static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "liuxun.zip") ;// 找到压缩文件ZipFile zipFile = new ZipFile(file) ;// 实例化ZipFile对象System.out.println("压缩文件的名称:" + zipFile.getName()) ;// 得到压缩文件的名称}};通过ZipFile文件,为liuxun.zip进行解压缩操作。
import java.io.File ;import java.io.FileInputStream ;import java.io.InputStream ;import java.io.OutputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipOutputStream ;import java.util.zip.ZipFile ;import java.io.FileOutputStream ;public class ZipFileDemo02{public static void main(String args[]) throws Exception{// 所有异常抛出File file = new File("d:" + File.separator + "liuxun.zip") ;// 找到压缩文件File outputFile = new File("d:" + File.separator + "liuxun_unzip.txt") ; // 定义解压缩的文件名称ZipFile zipFile = new ZipFile(file) ;// 实例化ZipFile对象ZipEntry entry = zipFile.getEntry("test.txt") ;// 得到一个压缩实体OutputStream out = new FileOutputStream(outputFile) ; // 实例化输出流InputStream input = zipFile.getInputStream(entry) ;// 得到一个压缩实体的输入流int temp = 0 ;while((temp=input.read())!=-1){out.write(temp) ;}input.close() ;// 关闭输入流out.close() ;// 关闭输出流}};
ZipInputStream
此类的定义如下:java.lang.Object
java.io.InputStream
java.io.FilterInputStream
java.util.zip.InflaterInputStream
java.util.zip.ZipInputStream
可以不用输入实体名称,就可以得到每一个ZipEntry对象
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 + "test.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的名称。
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 + "lx.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表示每一个压缩文件,可以得到每一个压缩实体的输入流。
0 0
- Java IO操作——掌握压缩流的使用(ZipOutputStream、ZipFile、ZipInputStream)[java.util包中]
- Java IO 之 ZipFile/ZipInputStream/ZipOutputStream
- Java IO--压缩流ZipOutputStream/ZipInputStream
- Java IO 压缩流(ZipOutputStream/ZipInputStream)
- 【Java.IO】I/O 【字节】【处理流】 - 之 - 【压缩流】 - ZipInputStream,ZipOutputStream
- JAVA 文件压缩和解压(ZIPINPUTSTREAM, ZIPOUTPUTSTREAM)
- JAVA 文件压缩和解压(ZIPINPUTSTREAM, ZIPOUTPUTSTREAM)
- ZipFile v.s. ZipInputStream in java.util.zip
- [Java语言] java 中使用ZipInputStream或ZipFile解压ZIP文件!!
- Java IO操作——专门的数据输入类Scanner(java.util工具包中)的具体使用
- java zipoutputstream 的使用
- 压缩解压缩工具 ZipInputStream ZipOutputStream
- 使用JAVA自带的zipInputStream进行解压缩文件包的操作
- java.util.zip.ZipInputStream翻译
- java.util.zip类 ZipInputStream
- java.util.zip.ZipOutputStream翻译
- java.util.zip类 ZipOutputStream
- 【Java】IO操作之使用zip包压缩和解压缩文件
- 数据库数据泵导出之前的完美数据量统计
- 数据库的扩容
- java双端链表
- 对mini2440存储器的理解和使用
- wcf教程-传递数据过大怎么配置?读取 XML 数据时,超出最大字符串内容长度配额 (8192)
- Java IO操作——掌握压缩流的使用(ZipOutputStream、ZipFile、ZipInputStream)[java.util包中]
- linux系统maven安装
- yum命令
- 根据日期判断星期几
- 如何让你的网站/应用/app满足大规模并发?
- TCPIP校验值的优化
- hdoj5806【尺取】
- NSDictionary writeToFile:atomically: 时失败
- SMP hybrid 开发实验1: Hello World