文件压缩 ZipOutputStream类
先举一个压缩单个文件的例子吧:
02 | import java.io.FileInputStream; |
03 | import java.io.FileOutputStream; |
04 | import java.io.IOException; |
05 | import java.io.InputStream; |
06 | import java.util.zip.ZipEntry; |
07 | import java.util.zip.ZipOutputStream; |
09 | public 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( |
16 | zipOut.putNextEntry( new ZipEntry(file.getName())); |
18 | zipOut.setComment( "hello" ); |
20 | while ((temp = input.read()) != - 1 ){ |
【运行结果】
运行结果之前,我创建了一个hello.txt的文件,原本大小56个字节,但是压缩之后产生hello.zip之后,居然变成了175个字节,有点搞不懂。
不过结果肯定是正确的,我只是提出我的一个疑问而已。
![](https://i-blog.csdnimg.cn/blog_migrate/063de5242c33069550fe9054c7a13665.png)
我按照这个代码重写了我自己的测试:代码如下:
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包内部的操作。
上面的这个例子测试的是压缩单个文件,下面的们来看看如何压缩多个文件。
02 | import java.io.FileInputStream; |
03 | import java.io.FileOutputStream; |
04 | import java.io.IOException; |
05 | import java.io.InputStream; |
06 | import java.util.zip.ZipEntry; |
07 | import java.util.zip.ZipOutputStream; |
12 | public class ZipOutputStreamDemo2{ |
13 | public static void main(String[] args) throws IOException{ |
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( |
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())); |
28 | while ((temp = input.read()) != - 1 ){ |
【运行结果】
先看看要被压缩的文件吧:
![]()
接下来看看压缩之后的:
![]()