posts - 22,comments - 35,trackbacks - 0

 

 1 package  util;
 2
 3 /* 本实例采用递归的方法,把指定的目录(包括子目录)压缩成一个ZIP文件。
 4 原理是:为指定目录的所有文件创建一个ZipEntry(压缩流入口),然后把文件写进去;当遇到子目录时,调用递归函数,把它压缩成另一个zip文件,当作一般文件写进去.
 5 //使用方法 java Zip <目录名>
 6 */

 7
 8 // java.util.zip包提供了数据压缩和解压缩的类
 9 import  java.io. * ;
10 import  java.util.zip. * ;
11
12
13 public   class  FileZip {
14     
15      static   final   int  BUFFER = 2048
16      static   boolean  flag = false ;
17     
18      public   static   void  main(String args[]) throws  IOException {
19         File file = new  File(args[ 0 ]);
20         FileInputStream file1 = new  FileInputStream(ZipSubdirectory(file));
21     }

22     
23      // ZipSubdirectory函数将一个指定目录(包括它子目录)压缩成一个同名压缩文件(这里称为"ORIGIN")
24      public   static  File ZipSubdirectory(File myDir) throws  IOException {
25      // 创建缓冲输入流BufferedInputStream 
26     BufferedInputStream origin = null ;
27      // 创建ZipOutputStream对象,将向它传递希望写入文件的输出流
28     File zipFile = new  File(myDir.getName() + " .zip " );
29     FileOutputStream fos = new  FileOutputStream(zipFile);
30     ZipOutputStream out = new  ZipOutputStream( new  BufferedOutputStream(fos,BUFFER));
31      // dirContents[]获取当前目录(myDir)所有文件对象(包括子目录名)
32     File dirContents[] = myDir.listFiles();
33      // 创建临时文件tempFile,使用后删除
34     File tempFile = null
35      try {
36          // 处理当前目录所有文件对象,包括子目录
37          for ( int  i = 0 ;i < dirContents.length;i ++ ) {
38              // 使用递归方法将当前目录的子目录转成一个ZIP文件,并作为一个ENTRY加进"ORIGIN" 
39              if (dirContents[i].isDirectory()) {
40                 tempFile = ZipSubdirectory(dirContents[i]);
41                 flag = true ;
42             }

43              // 如果当前文件不是子目录
44              else {
45                 tempFile = dirContents[i];
46                  // flag标记tempFile是否由子目录压缩成的ZIP文件
47                 flag = false ;
48             }

49             
50             System.out.println( " Compress file:  " + tempFile.getName());
51             
52             FileInputStream fis = new  FileInputStream(tempFile);
53             origin = new  BufferedInputStream(fis,BUFFER);
54              // 为被读取的文件创建压缩条目
55             ZipEntry entry = new  ZipEntry(tempFile.getName());
56              byte  data[] = new   byte [BUFFER];
57              int  count;
58              // 在向ZIP输出流写入数据之前,必须首先使用out.putNextEntry(entry); 方法安置压缩条目对象 
59             out.putNextEntry(entry);
60             
61              // 向ZIP 文件写入数据 
62              while ((count = origin.read(data, 0 ,BUFFER)) !=- 1 ) {
63                 out.write(data, 0 ,count);
64             }

65             
66              // tempFile是临时生成的ZIP文件,删除它
67              if (flag == true ) {
68                 flag = tempFile.delete();
69                 System.out.println( " Delete file: " + tempFile.getName() + flag); 
70             }
 
71              // 关闭输入流 
72             origin.close(); 
73         }

74         out.close();
75     }

76      catch (Exception e) {System.out.println(e);
77     }

78      // 递归返回 
79      return  zipFile; 
80     }

81 }

82
posted on 2006-04-21 17:11 kelven 阅读(995) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: