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()));
然后就可以讀入數據了。
明顯網絡數據傳送就加了一個壓縮,性能就可以提高了。

]]>