javaIO复习第二阶段

文件压缩 ZipOutputStream类

先举一个压缩单个文件的例子吧:

01import java.io.File;
02import java.io.FileInputStream;
03import java.io.FileOutputStream;
04import java.io.IOException;
05import java.io.InputStream;
06import java.util.zip.ZipEntry;
07import java.util.zip.ZipOutputStream;
08 
09public class ZipOutputStreamDemo1{
10    public static void main(String[] args) throws IOException{
11        File file = new File("d:" + File.separator + "hello.txt");
12        File zipFile = new File("d:" + File.separator + "hello.zip");
13        InputStream input = new FileInputStream(file);
14        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(
15                zipFile));
16        zipOut.putNextEntry(new ZipEntry(file.getName()));
17        // 设置注释
18        zipOut.setComment("hello");
19        int temp = 0;
20        while((temp = input.read()) != -1){
21            zipOut.write(temp);
22        }
23        input.close();
24        zipOut.close();
25    }
26}

【运行结果】

运行结果之前,我创建了一个hello.txt的文件,原本大小56个字节,但是压缩之后产生hello.zip之后,居然变成了175个字节,有点搞不懂。

不过结果肯定是正确的,我只是提出我的一个疑问而已。

我按照这个代码重写了我自己的测试:代码如下:

File file = new File("D:"+File.separator+"hello.txt");
		        File zipFile = new File("D:"+File.separator+"hello.zip");
		         
		        try {
		            InputStream inStream = new FileInputStream(file);
		            OutputStream outStream = new FileOutputStream(zipFile);
		             
	            ZipOutputStream zipOut = new ZipOutputStream(outStream);
		            //加入实体
		            zipOut.putNextEntry(new ZipEntry(file.getName()));
		             
		            String Comment = new String("我的压缩程序".getBytes(),"unicode");
		          //添加注释
		        zipOut.setComment(Comment);
		        
		            int temp = 0;
		            while((temp = inStream.read())!=-1){
		                zipOut.write(temp);
		            }
		            inStream.close();
		            //如果outStream先关闭的话会发生错误
		            
		            zipOut.close();
		            outStream.close();
		        } catch (Exception e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        } 


注意点 :1、如果在压缩文件的注释内输入中文则会出现乱码。

2、在zipOut流关闭之前,先关闭FileOutPut流则会抛出异常;流的嵌套只要关闭最外层的那个流,就相当于已经关闭了嵌套的所有流了。

于是我提出了两个问题:1、嵌套的流是否只需要关闭最外层的即可。

2、在zip文件的注释内部输入中文时产生乱码的问题?

解决方案:1、流的嵌套只要关闭最外层的那个流,就相当于已经关闭了嵌套的所有流了。(错误的 后创建的流要先关闭)

2、用java来打包文件生成压缩文件,有两个地方会出现乱码 
1、内容的中文乱码问题,这个问题网上很多人给出了解决方法,两种:修改sun的源码;使用开源的类库org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,这两个类ant.jar中有,可以下载使用即可,毫无疑问,选择后者更方便 
2、压缩文件注释的中文乱码问题:zos.setComment("中文测试");这个问题在网上查了半天没看到有人解释,遂只能自己想办法解决。在自己机器上的工程创建的测试类,没有任何问题,但是在公司的项目中使用一直出现乱码,通过使用设置编码的方法(zos.setEncoding("gbk");)终于发现了问题,测试项目的编码方式为gbk,而公司项目的默认编码是utf-8,所以测试项目没问题而公司的项目中出现了问题。 

org.apache.tools.zip.ZipOutputStream默认使用项目的编码方式,理论上讲utf-8也是支持中文的,是在想不通为啥还是乱码,通过setEncoding方法改成gbk即可解决


所以,使用压缩程序的时候尽量使用org.apache.tools.zip.ZipOutputStream包内部的操作。

上面的这个例子测试的是压缩单个文件,下面的们来看看如何压缩多个文件。

01import java.io.File;
02import java.io.FileInputStream;
03import java.io.FileOutputStream;
04import java.io.IOException;
05import java.io.InputStream;
06import java.util.zip.ZipEntry;
07import java.util.zip.ZipOutputStream;
08 
09/**
10 * 一次性压缩多个文件
11 * */
12public class ZipOutputStreamDemo2{
13    public static void main(String[] args) throws IOException{
14        // 要被压缩的文件夹
15        File file = new File("d:" + File.separator + "temp");
16        File zipFile = new File("d:" + File.separator + "zipFile.zip");
17        InputStream input = null;
18        ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(
19                zipFile));
20        zipOut.setComment("hello");
21        if(file.isDirectory()){
22            File[] files = file.listFiles();
23            for(int i = 0; i < files.length; ++i){
24                input = new FileInputStream(files[i]);
25                zipOut.putNextEntry(new ZipEntry(file.getName()
26                        + File.separator + files[i].getName()));
27                int temp = 0;
28                while((temp = input.read()) != -1){
29                    zipOut.write(temp);
30                }
31                input.close();
32            }
33        }
34        zipOut.close();
35    }
36}

【运行结果】

先看看要被压缩的文件吧:

接下来看看压缩之后的:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值