文档章节

Java实现Zip压缩与解压(解决中文乱码问题)

涩女郎
 涩女郎
发布于 2014/11/22 11:13
字数 573
阅读 47
收藏 0

解决中文压缩与解压问题 
使用的是org.apache.tools.zip包下面的相关类 
下面是自己写的类,可以设置和获取Zip文件的注释信息 

Java代码  收藏代码

  1. import java.io.File;  

  2. import java.io.FileInputStream;  

  3. import java.io.FileOutputStream;  

  4. import java.io.InputStream;  

  5. import java.util.ArrayList;  

  6. import java.util.Enumeration;  

  7. import java.util.List;  

  8.   

  9. import org.apache.tools.zip.ZipEntry;  

  10. import org.apache.tools.zip.ZipFile;  

  11. import org.apache.tools.zip.ZipOutputStream;  

  12.   

  13.   

  14. public class ZipUtil {  

  15.       

  16.     private String comment = "";  

  17.       

  18.     public void setComment(String comment) {  

  19.         this.comment = comment;  

  20.     }  

  21.   

  22.     /** 

  23.      * @param src:要压缩的目录 

  24.      * @param dest:压缩文件存档 

  25.      * @throws Exception 

  26.      */  

  27.     public void zip(String src, String dest, List filter) throws Exception {  

  28.         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dest));  

  29.         File srcFile = new File(src);  

  30.         zip(out,srcFile,"",filter);  

  31.         out.close();  

  32.     }  

  33.       

  34.     /** 

  35.      * @param out 

  36.      * @param srcFile 

  37.      * @param base:根路径 

  38.      * @param filter:过滤 

  39.      * @throws Exception 

  40.      */  

  41.     public void zip(ZipOutputStream out, File srcFile, String base, List filter) throws Exception {  

  42.         if(srcFile.exists()==false) {  

  43.             throw new Exception("压缩目录不存在!");  

  44.         }  

  45.           

  46.         if(srcFile.isDirectory()) {  

  47.             File[] files = srcFile.listFiles();  

  48.             base = base.length() == 0 ? "" : base + "/";  

  49.             if (isExist(base, filter)) {  

  50.                 out.putNextEntry(new ZipEntry(base));  

  51.             }  

  52.             for(int i=0; i<files.length; i++) {  

  53.                 zip(out,files[i],base + files[i].getName(),filter);  

  54.             }  

  55.         } else {  

  56.             if (isExist(base, filter)) {  

  57.                 base = base.length() == 0 ? srcFile.getName() : base ;  

  58.                 ZipEntry zipEntry = new ZipEntry(base);  

  59.                 zipEntry.setComment(comment);  

  60.                 out.putNextEntry(zipEntry);  

  61.                 FileInputStream in = new FileInputStream(srcFile);  

  62.                 int length = 0;  

  63.                 byte[] b = new byte[1024];  

  64.                 while((length=in.read(b,0,1024))!=-1) {  

  65.                     out.write(b,0,length);  

  66.                 }  

  67.                 in.close();  

  68.             }  

  69.         }  

  70.     }  

  71.       

  72.     /** 

  73.      * 过滤出要压缩的文件夹 

  74.      * @param base 

  75.      * @param list 

  76.      * @return 

  77.      */  

  78.     public boolean isExist(String base, List list) {  

  79.         if (list != null && !list.isEmpty()) {  

  80.             for (int i = 0; i < list.size(); i++) {  

  81.                 if (base.indexOf((String) list.get(i)) >= 0) {  

  82.                     return true;  

  83.                 }  

  84.             }  

  85.         }  

  86.         return false;  

  87.     }  

  88.       

  89.     /** 

  90.      * @param srcFile:压缩文件路径 

  91.      * @param dest:解压到的目录 

  92.      * @param deleteFile:解压完成后是否删除文件 

  93.      * @throws Exception 

  94.      */  

  95.     public void unZip(String srcFile,String dest,boolean deleteFile)  throws Exception {  

  96.         File file = new File(srcFile);  

  97.         if(!file.exists()) {  

  98.             throw new Exception("解压文件不存在!");  

  99.         }  

  100.         ZipFile zipFile = new ZipFile(file);  

  101.         Enumeration e = zipFile.getEntries();  

  102.         while(e.hasMoreElements()) {  

  103.             ZipEntry zipEntry = (ZipEntry)e.nextElement();  

  104.             if(zipEntry.isDirectory()) {  

  105.                 String name = zipEntry.getName();  

  106.                 name = name.substring(0,name.length()-1);  

  107.                 File f = new File(dest + name);  

  108.                 f.mkdirs();  

  109.             } else {  

  110.                 File f = new File(dest + zipEntry.getName());  

  111.                 f.getParentFile().mkdirs();  

  112.                 f.createNewFile();  

  113.                 InputStream is = zipFile.getInputStream(zipEntry);  

  114.                 FileOutputStream fos = new FileOutputStream(f);  

  115.                 int length = 0;  

  116.                 byte[] b = new byte[1024];  

  117.                 while((length=is.read(b, 01024))!=-1) {  

  118.                     fos.write(b, 0, length);  

  119.                 }  

  120.                 is.close();  

  121.                 fos.close();  

  122.             }  

  123.         }  

  124.           

  125.         if (zipFile != null) {  

  126.             zipFile.close();  

  127.         }  

  128.           

  129.         if(deleteFile) {  

  130.             file.deleteOnExit();  

  131.         }  

  132.     }  

  133.       

  134.     /** 

  135.      * 获取Zip文件的注释信息 

  136.      * @param srcFile 

  137.      * @return 

  138.      */  

  139.     public static String getZipComment(String srcFile) {  

  140.         String comment = "";  

  141.         try {  

  142.             ZipFile zipFile = new ZipFile(srcFile);  

  143.             Enumeration e = zipFile.getEntries();  

  144.   

  145.             while (e.hasMoreElements()) {  

  146.                 ZipEntry ze = (ZipEntry) e.nextElement();  

  147.   

  148.                 comment = ze.getComment();  

  149.                 if (comment != null && !comment.equals("")  

  150.                         && !comment.equals("null")) {  

  151.                     break;  

  152.                 }  

  153.             }  

  154.   

  155.             zipFile.close();  

  156.         } catch (Exception e) {  

  157.             System.out.println("获取zip文件注释信息失败:" + e.getMessage());  

  158.         }  

  159.   

  160.         return comment;  

  161.     }  

  162.   

  163.     public static void main(String[] args) throws Exception {  

  164.         long begin = System.currentTimeMillis();  

  165.         ZipUtil zu = new ZipUtil();  

  166.         List<String> filter = new ArrayList<String>();  

  167.         filter.add("3RDPARTY");  

  168.         filter.add("BANNER.GIF");  

  169.         zu.setComment("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");  

  170.         zu.zip("C:/VALUEADD""c:/hh.zip",filter);  

  171.         System.out.println(ZipUtil.getZipComment("c:/hh.zip"));  

  172.         //new ZipUtil().unZip("c:/tt.zip", "c:/mmmmmmmmmmmmmmmmmmm/", true);  

  173.         //File f = new File("c:/hh.zip");  

  174.         //f.deleteOnExit();  

  175.         long end = System.currentTimeMillis();  

  176.         System.out.println(end-begin);  

  177.     }  

  178. }  


本文转载自:http://royzhou1985.iteye.com/blog/341197

涩女郎
粉丝 37
博文 104
码字总数 160210
作品 0
浦东
高级程序员
私信 提问
使用ubuntu 10.04中的中文乱码问题解决

1、ibus输入法 Ubuntu 系统安装后已经自带了ibus输入法,在英语环境下默认不启动。 配置ibus自动启动可以在ubuntu系统菜单上选择System --- Preferences --- Startup Applications,在该窗口...

durban
2012/08/25
199
0
zip压缩问题

java压缩了zip文件,linux下用unzip解压,中文名称乱码,网上查的都不对,1是用 ant下面的试过也是乱码2设置gbk还是乱码,3用过zip4j 解压还是乱码,设置编码gbk utf-8 也试过了,还是乱码,...

obhen
2017/10/25
394
5
Java实现Zip压缩与解压(解决中文乱码问题)

解决中文压缩与解压问题 使用的是org.apache.tools.zip包下面的相关类 下面是自己写的类,可以设置和获取Zip文件的注释信息 Java代码 import java.io.File; import java.io.FileInputStream;...

李长春
2011/07/19
3.2K
0
Tomcat中文乱码问题的原理和解决方法

Tomcat中文乱码问题的原理和解决方法   自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。   一、Java中文问题的由...

孙斐
2013/02/26
253
0
Centos下安装类百度文库环境

使用php实现百度文库功能,网上搜索到的方案,实现doc转pdf,pdf转swf,然后显示出来。 这里简单的记录下,【doc转pdf,pdf转swf】两个功能的搭建流程。 doc转pdf 使用到下列程序(文件): Ap...

DragonFK
2013/02/20
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
27分钟前
10
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
55分钟前
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
55分钟前
7
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
今天
19
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部