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(ZipEntrye) throws IOException在压缩文件中,每一个压缩的内容都可以用一个ZipEntry 表示,所以在进行压缩之前必须通过putNextEntry 设置一个ZipEntry 即可。
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.InputStream;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipOutputStream;
- importjava.io.FileOutputStream;
- publicclassZipOutputStreamDemo01{
- publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出
- Filefile=newFile("d:"+File.separator+"mldn.txt");//定义要压缩的文件
- FilezipFile=newFile("d:"+File.separator+"mldn.zip");//定义压缩文件名称
- InputStreaminput=newFileInputStream(file);//定义文件的输入流
- ZipOutputStreamzipOut=null;//声明压缩流对象
- zipOut=newZipOutputStream(newFileOutputStream(zipFile));
- zipOut.putNextEntry(newZipEntry(file.getName()));//设置ZipEntry对象
- zipOut.setComment("www.mldnjava.cn");//设置注释
- inttemp=0;
- while((temp=input.read())!=-1){//读取内容
- zipOut.write(temp);//压缩输出
- }
- input.close();//关闭输入流
- zipOut.close();//关闭输出流
- }
- };
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.InputStream;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipOutputStream;
- importjava.io.FileOutputStream;
- publicclassZipOutputStreamDemo02{
- publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出
- Filefile=newFile("d:"+File.separator+"mldn");//定义要压缩的文件夹
- FilezipFile=newFile("d:"+File.separator+"mldndir.zip");//定义压缩文件名称
- InputStreaminput=null;//定义文件输入流
- ZipOutputStreamzipOut=null;//声明压缩流对象
- zipOut=newZipOutputStream(newFileOutputStream(zipFile));
- zipOut.setComment("www.mldnjava.cn");//设置注释
- inttemp=0;
- if(file.isDirectory()){//判断是否是文件夹
- Filelists[]=file.listFiles();//列出全部文件
- for(inti=0;i<lists.length;i++){
- input=newFileInputStream(lists[i]);//定义文件的输入流
- zipOut.putNextEntry(newZipEntry(file.getName()
- +File.separator+lists[i].getName()));//设置ZipEntry对象
- while((temp=input.read())!=-1){//读取内容
- zipOut.write(temp);//压缩输出
- }
- input.close();//关闭输入流
- }
- }
- zipOut.close();//关闭输出流
- }
- };
是一个专门表示压缩文件的类。
ZipFile 在实例化的时候必须接收File 类的实例。此File 类的实例是指向一个压缩 *.zip 文件。
第一步:为 ZipFile 实例化
实例化时需要接收File 类的引用
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.InputStream;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipOutputStream;
- importjava.util.zip.ZipFile;
- importjava.io.FileOutputStream;
- publicclassZipFileDemo01{
- publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出
- Filefile=newFile("d:"+File.separator+"mldn.zip");//找到压缩文件
- ZipFilezipFile=newZipFile(file);//实例化ZipFile对象
- System.out.println("压缩文件的名称:"+zipFile.getName());//得到压缩文件的名称
- }
- };
通过ZipFile 文件,为mldn.zip 进行解压缩操作。
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.InputStream;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipOutputStream;
- importjava.io.FileOutputStream;
- publicclassZipOutputStreamDemo02{
- publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出
- Filefile=newFile("d:"+File.separator+"mldn");//定义要压缩的文件夹
- FilezipFile=newFile("d:"+File.separator+"mldndir.zip");//定义压缩文件名称
- InputStreaminput=null;//定义文件输入流
- ZipOutputStreamzipOut=null;//声明压缩流对象
- zipOut=newZipOutputStream(newFileOutputStream(zipFile));
- zipOut.setComment("www.mldnjava.cn");//设置注释
- inttemp=0;
- if(file.isDirectory()){//判断是否是文件夹
- Filelists[]=file.listFiles();//列出全部文件
- for(inti=0;i<lists.length;i++){
- input=newFileInputStream(lists[i]);//定义文件的输入流
- zipOut.putNextEntry(newZipEntry(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
- importjava.io.File;
- importjava.io.FileInputStream;
- importjava.io.InputStream;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipInputStream;
- importjava.io.FileInputStream;
- publicclassZipInputStreamDemo01{
- publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出
- FilezipFile=newFile("d:"+File.separator+"mldn.zip");//定义压缩文件名称
- ZipInputStreaminput=null;//定义压缩输入流
- input=newZipInputStream(newFileInputStream(zipFile));//实例化ZIpInputStream
- ZipEntryentry=input.getNextEntry();//得到一个压缩实体
- System.out.println("压缩实体名称:"+entry.getName());
- input.close();
- }
- };
ZipFile 对象,可以找到每一个ZipEntry 的输入流。但是ZipInputStream 并不能得到每一个输入流,所以需要使用ZipFile,但是ZipInputStream 在取得每一个ZipEntry 的时候,不需要每一个ZipEntry 的时候,不需要每一个ZipEntry 的名称。
- importjava.io.File;
- importjava.io.OutputStream;
- importjava.io.InputStream;
- importjava.util.zip.ZipEntry;
- importjava.util.zip.ZipFile;
- importjava.util.zip.ZipInputStream;
- importjava.io.FileInputStream;
- importjava.io.FileOutputStream;
- publicclassZipInputStreamDemo02{
- publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出
- Filefile=newFile("d:"+File.separator+"mldndir.zip");//定义压缩文件名称
- FileoutFile=null;//输出文件的时候要有文件夹的操作
- ZipFilezipFile=newZipFile(file);//实例化ZipFile对象
- ZipInputStreamzipInput=null;//定义压缩输入流
- OutputStreamout=null;//定义输出流,用于输出每一个实体内容
- InputStreaminput=null;//定义输入流,读取每一个ZipEntry
- ZipEntryentry=null;//每一个压缩实体
- zipInput=newZipInputStream(newFileInputStream(file));//实例化ZIpInputStream
- while((entry=zipInput.getNextEntry())!=null){//得到一个压缩实体
- System.out.println("解压缩"+entry.getName()+"文件。");
- outFile=newFile("d:"+File.separator+entry.getName());//定义输出的文件路径
- if(!outFile.getParentFile().exists()){//如果输出文件夹不存在
- outFile.getParentFile().mkdir();//创建文件夹
- }
- if(!outFile.exists()){//判断输出文件是否存在
- outFile.createNewFile();//创建文件
- }
- input=zipFile.getInputStream(entry);//得到每一个实体的输入流
- out=newFileOutputStream(outFile);//实例化文件输出流
- inttemp=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 可以得到每一个实体,但是却无法得到每一个实体的输入流。