Java如何使用ZipOutputStream对一个文件目录进行压缩呢?

书欣 Java经验 发布时间:2022-10-14 21:48:44 阅读数:6215 1 zip操作大全
下文笔者讲述使用ZipOutputStream对目录进行压缩的方法分享,如下所示
实现思路:
    1.借助ZipEntry构造函数生成一个文件目录的zipEntry条目对象
	2.将zipEntry条目对象放入,使用zipOutputStream对象的putNextEntry方法
	3.借助zipOutputStream对象的write方法写入文件流
例:
编写一个对文件目录压缩的工具类
package  com.java265.util;
 
  /* 采用递归的方法
   *将指定的目录(包括子目录)压缩成一个ZIP文件。
   */
  // java.util.zip包提供了数据压缩和解压缩的类
  import  java.io.* ;
  import  java.util.zip.* ;
  public   class  FileZip {   
      static   final   int  BUFFER = 2048 ; 
      static   boolean  flag = false ;
  
       //测试类   
       public   static   void  main(String args[]) throws  IOException {
         File file = new  File(args[ 0 ]);
         FileInputStream file1 = new  FileInputStream(ZipSubdirectory(file));
     }
     
	  //ZipSubdirectory函数将一个指定目录(包括它子目录)压缩成一个同名压缩文件(这里称为"ORIGIN")
       public   static  File ZipSubdirectory(File myDir) throws  IOException {
      // 创建缓冲输入流BufferedInputStream 
      BufferedInputStream origin = null ;
      // 创建ZipOutputStream对象,将向它传递希望写入文件的输出流
      File zipFile = new  File(myDir.getName() + " .zip " );
     FileOutputStream fos = new  FileOutputStream(zipFile);
     ZipOutputStream out = new  ZipOutputStream( new  BufferedOutputStream(fos,BUFFER));
      //dirContents[]获取当前目录(myDir)所有文件对象(包括子目录名)
      File dirContents[] = myDir.listFiles();
      //创建临时文件tempFile,使用后删除
      File tempFile = null ; 
       try {
           //处理当前目录所有文件对象,包括子目录
           for(int  i = 0;i<dirContents.length;i++ ) {
              //使用递归方法将当前目录的子目录转成一个ZIP文件
              //并作为一个ENTRY加进"ORIGIN" 
               if (dirContents[i].isDirectory()) {
                 tempFile = ZipSubdirectory(dirContents[i]);
                 flag = true ;
             }
              // 如果当前文件不是子目录
               else {
                 tempFile = dirContents[i];
                  // flag标记tempFile是否由子目录压缩成的ZIP文件
                  flag = false ;
             }
             
             System.out.println( " Compress file:  " + tempFile.getName());
             
             FileInputStream fis = new  FileInputStream(tempFile);
             origin = new  BufferedInputStream(fis,BUFFER);
              // 为被读取的文件创建压缩条目
              ZipEntry entry = new  ZipEntry(tempFile.getName());
              byte  data[] = new   byte [BUFFER];
              int  count;
              // 在向ZIP输出流写入数据之前,必须首先使用out.putNextEntry(entry); 方法安置压缩条目对象 
              out.putNextEntry(entry);
             
              // 向ZIP 文件写入数据 
               while ((count = origin.read(data, 0 ,BUFFER)) !=- 1 ) {
                 out.write(data, 0 ,count);
             }
             
              // tempFile是临时生成的ZIP文件,删除它
               if (flag == true ) {
                 flag = tempFile.delete();
                 System.out.println( " Delete file: " + tempFile.getName() + flag); 
             }  
              // 关闭输入流 
              origin.close(); 
         }
         out.close();
     }
       catch (Exception e) {System.out.println(e);
     }
      // 递归返回 
       return  zipFile; 
     }
 }
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202210/16657561554639.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者