javaIO复习第二阶段
来源:互联网 发布:淘宝 淘气值 编辑:程序博客网 时间:2024/06/04 00:33
文件压缩 ZipOutputStream类
先举一个压缩单个文件的例子吧:
01
import
java.io.File;
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;
08
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(
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包内部的操作。
上面的这个例子测试的是压缩单个文件,下面的们来看看如何压缩多个文件。
01
import
java.io.File;
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;
08
09
/**
10
* 一次性压缩多个文件
11
* */
12
public
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
}
【运行结果】
先看看要被压缩的文件吧:
接下来看看压缩之后的:
- javaIO复习第二阶段
- JAVAIO复习第一阶段【转部分】
- day04 -----深入浅出mysql-----javaio复习
- C语言总复习第二阶段部分练习题
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- 第二阶段
- javaio
- JavaIO
- JavaIO
- JavaIO
- javaIO
- javaIO
- JAVAIO
- 实训——UML
- 【mac os x安装方案】新手安装指南:一步一步在Windows安装苹果雪豹系统【远景】
- C++对象模型 ch4 Function语义学
- ibatis + Spring 多表查询(3)
- 设计模式概要
- javaIO复习第二阶段
- 有关IsIconic 确定给定窗口是否是最小化(图标化)的窗口
- 高分求解一个需求JQUEYR SELECT TEXT
- 免费的魔力有多大?!免费商业模式完全指南
- oracle 11 修改主机hostname 后listener 无法启动
- 编译器后端寄存器分配算法SSA(静态单一赋值法)
- Gstreamer 工具使用 (一)
- 实例讲解linux压缩命令
- 正好碰到了C++的函数对象,查各路资料,总结写下来吧