Java操作zip压缩和解压缩文件工具类

简介:

需要用到ant.jar(这里使用的是ant-1.6.5.jar)

复制代码
  1 import java.io.File;
  2 import java.io.FileInputStream;
  3 import java.io.FileNotFoundException;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.OutputStream;
  8 import java.util.ArrayList;
  9 import java.util.Enumeration;
 10 import java.util.List;
 11 
 12 import org.apache.tools.zip.ZipEntry;
 13 import org.apache.tools.zip.ZipFile;
 14 import org.apache.tools.zip.ZipOutputStream;
 15 
 16 
 17 /**
 18  * 压缩或解压zip:
 19  * 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
 20  * @author Administrator
 21  */
 22 
 23 public class ZipUtil {
 24     private static byte[] _byte = new byte[1024] ;
 25     /**
 26      * 压缩文件或路径
 27      * @param zip 压缩的目的地址
 28      * @param srcFiles 压缩的源文件
 29      */
 30     public static void zipFile( String zip , List<File> srcFiles ){
 31         try {
 32             if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
 33                 ZipOutputStream _zipOut = new ZipOutputStream(new FileOutputStream(new File(zip))) ;
 34                 _zipOut.setEncoding("GBK");
 35                 for( File _f : srcFiles ){
 36                     handlerFile(zip , _zipOut , _f , "");
 37                 }
 38                 _zipOut.close();
 39             }else{
 40                 System.out.println("target file[" + zip + "] is not .zip type file");
 41             }
 42         } catch (FileNotFoundException e) {
 43         } catch (IOException e) {
 44         }
 45     }
 46     
 47     /**
 48      * 
 49      * @param zip 压缩的目的地址
 50      * @param zipOut 
 51      * @param srcFile  被压缩的文件信息
 52      * @param path  在zip中的相对路径
 53      * @throws IOException
 54      */
 55     private static void handlerFile(String zip , ZipOutputStream zipOut , File srcFile , String path ) throws IOException{
 56         System.out.println(" begin to compression file[" + srcFile.getName() + "]");
 57         if( !"".equals(path) && ! path.endsWith(File.separator)){
 58             path += File.separator ;
 59         }
 60         if( ! srcFile.getPath().equals(zip) ){
 61             if( srcFile.isDirectory() ){
 62                 File[] _files = srcFile.listFiles() ;
 63                 if( _files.length == 0 ){
 64                     zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
 65                     zipOut.closeEntry();
 66                 }else{
 67                     for( File _f : _files ){
 68                         handlerFile( zip ,zipOut , _f , path + srcFile.getName() );
 69                     }
 70                 }
 71             }else{
 72                 InputStream _in = new FileInputStream(srcFile) ;
 73                 zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
 74                 int len = 0 ; 
 75                 while( (len = _in.read(_byte)) > 0  ){
 76                     zipOut.write(_byte, 0, len);
 77                 }
 78                 _in.close();
 79                 zipOut.closeEntry();
 80             }
 81         }
 82     }
 83 
 84     /**
 85      * 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下
 86      * @param zipName 待解压缩的ZIP文件名
 87      * @param targetBaseDirName  目标目录
 88      */
 89     public static List<File> upzipFile(String zipPath, String descDir) {
 90         return upzipFile( new File(zipPath) , descDir ) ;
 91     }
 92     
 93     /**
 94      * 对.zip文件进行解压缩
 95      * @param zipFile  解压缩文件
 96      * @param descDir  压缩的目标地址,如:D:\\测试 或 /mnt/d/测试
 97      * @return
 98      */
 99     @SuppressWarnings("rawtypes")
100     public static List<File> upzipFile(File zipFile, String descDir) {
101         List<File> _list = new ArrayList<File>() ;
102         try {
103             ZipFile _zipFile = new ZipFile(zipFile , "GBK") ;
104             for( Enumeration entries = _zipFile.getEntries() ; entries.hasMoreElements() ; ){
105                 ZipEntry entry = (ZipEntry)entries.nextElement() ;
106                 File _file = new File(descDir + File.separator + entry.getName()) ;
107                 if( entry.isDirectory() ){
108                     _file.mkdirs() ;
109                 }else{
110                     File _parent = _file.getParentFile() ;
111                     if( !_parent.exists() ){
112                         _parent.mkdirs() ;
113                     }
114                     InputStream _in = _zipFile.getInputStream(entry);
115                     OutputStream _out = new FileOutputStream(_file) ;
116                     int len = 0 ;
117                     while( (len = _in.read(_byte)) > 0){
118                         _out.write(_byte, 0, len);
119                     }
120                     _in.close(); 
121                     _out.flush();
122                     _out.close();
123                     _list.add(_file) ;
124                 }
125             }
126         } catch (IOException e) {
127         }
128         return _list ;
129     }
130     
131     /**
132      * 对临时生成的文件夹和文件夹下的文件进行删除
133      */
134     public static void deletefile(String delpath) {
135         try {
136             File file = new File(delpath);
137             if (!file.isDirectory()) {
138                 file.delete();
139             } else if (file.isDirectory()) {
140                 String[] filelist = file.list();
141                 for (int i = 0; i < filelist.length; i++) {
142                     File delfile = new File(delpath + File.separator + filelist[i]);
143                     if (!delfile.isDirectory()) {
144                         delfile.delete();
145                     } else if (delfile.isDirectory()) {
146                         deletefile(delpath + File.separator + filelist[i]);
147                     }
148                 }
149                 file.delete();
150             }
151         } catch (Exception e) {
152             e.printStackTrace();
153         }
154     }
155     
156     public static void main(String[] args) {}
157     
158 }
复制代码

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5760477.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
77 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
83 2
|
21天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
82 34
|
1月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
43 3
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
107 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
62 4
|
Java 大数据 Apache
|
Java Windows 移动开发