Posted on 2008-10-07 14:15
Qzi 阅读(1712)
评论(0) 编辑 收藏 所属分类:
java foundation
ZIP压缩IO涉及类(包括操作文件夹压缩)
ZipEntry标识zip文件中单个文件的入口,它也支持路径加文件名,所以通过配置它,可以建立目录层次的zip文件(见下例子)
ZipOutputStream,write数据到zip文件的对象
ZipInputStream,从zip文件中read数据的对象,其实基本上这个没有作用
ZipFile,获取zip文件里面单个文件入口,getInputStream()等信息的对象,初始化ZipFile zf = new ZipFile(zip压缩文件的File对象);
Enumeration entries = =zf.entries()可以获得所有的zip文件里面的文件入口。
原理就是:entry指定单个文件相对zip压缩文件内部根目录的位置,Stream操作输出输入,ZipFile代表的就是整个zip文件
示例代码
1 package zipLearning;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.util.zip.ZipEntry;
7 import java.util.zip.ZipOutputStream;
8
9 public class testZip {
10 private static final int BUFFER_SIZE = 100;
11
12 public static void main(String[] args) {
13 if (args.length == 2) {
14 File file = new File(args[0]);
15 if (file.exists())
16 file.delete();
17 zip(new File(args[0]), new File(args[1]).listFiles());
18 } else {
19 System.err.println("Command Parameters Error!");
20 System.out
21 .println("usage testZip zip_target_name in_file_or_dir_name");
22 }
23 }
24
25 public static void zip(File zipFile, File[] zippedFiles) {
26 try {
27 byte[] buffer = new byte[BUFFER_SIZE];
28 FileOutputStream fs = new FileOutputStream(zipFile);
29 ZipOutputStream zipOut = new ZipOutputStream(fs);
30
31 for (int i = 0, n = zippedFiles.length; i < n; i++) {
32 if (zippedFiles[i] == null || !zippedFiles[i].exists())
33 continue;
34 if (zippedFiles[i].isDirectory()) {
35 zip(zippedFiles[i].listFiles(), zipOut, buffer,
36 zippedFiles[i].getName());
37 continue;
38 }
39 ZipEntry zipAdd = new ZipEntry(zippedFiles[i].getName());
40 zipAdd.setTime(zippedFiles[i].lastModified());
41 zipOut.putNextEntry(zipAdd);
42
43 FileInputStream in = new FileInputStream(zippedFiles[i]);
44 while (true) {
45 int readSize = in.read(buffer, 0, buffer.length);
46 if (readSize < 0) {
47 break;
48 }
49 zipOut.write(buffer, 0, readSize);
50 }
51 in.close();
52 }
53 zipOut.close();
54 fs.close();
55 } catch (Exception e) {
56 e.printStackTrace();
57 }
58 }
59
60 public static void zip(File[] zippedFiles, ZipOutputStream zipOut,
61 byte[] buffer, String base) throws Exception {
62 base = base + "/";
63 for (int i = 0, n = zippedFiles.length; i < n; i++) {
64 if (zippedFiles[i] == null || !zippedFiles[i].exists())
65 continue;
66
67 if (zippedFiles[i].isDirectory()) {
68 zip(zippedFiles[i].listFiles(), zipOut, buffer, base
69 + zippedFiles[i].getName());
70 continue;
71 }
72
73 ZipEntry zipAdd = new ZipEntry(base + zippedFiles[i].getName());
74 zipAdd.setTime(zippedFiles[i].lastModified());
75 zipOut.putNextEntry(zipAdd);
76
77 FileInputStream in = new FileInputStream(zippedFiles[i]);
78 while (true) {
79 int readSize = in.read(buffer, 0, buffer.length);
80 if (readSize < 0) {
81 break;
82 }
83 zipOut.write(buffer, 0, readSize);
84 }
85 in.close();
86 }
87 }
88 }
89
JAR压缩类与ZIP是几乎一模一样对应的分别为:JarEntry JarFile JarInputStream JarOutputStream
GZIP格式,只提供GZIPInputStream和GZIPOutputStream类,因为其作用是单纯的压缩与解压,不维护文件结构。多数用于基于流的数据传送过程实现数据压缩。用法就如Bufer Stream一样,是stream之间的又一个过滤类,只是Buffer提供缓冲,而GZIP提供压缩。
例如需要网络传送压缩就可以这样做:
客户端:
Socket socket = new Socket(服务器地址字符串, 服务器端口);
BufferOutputStream out = new BufferOutPutStream(new GZIPOutputStream(socket.getOutputStream()));
然后就可以操作数据输出了
服务器端:
ServerSocket sSocket = new ServerSocket(服务器端口);
Socket socket = sSocket.accept();
BufferInputStream in = new BufferInputStream(new GZIPInputStream(socket.getInputStream()));
然后就可以读入数据了。
明显网络数据传送就加了一个压缩,性能就可以提高了。