java 压缩IO类

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()));
然后就可以读入数据了。
明显网络数据传送就加了一个压缩,性能就可以提高了。

你可能感兴趣的:(java 压缩IO类)