Java实现Zip压缩与解压(解决中文乱码问题)
来源:互联网 发布:软件开发保密协议 编辑:程序博客网 时间:2024/05/10 21:42
解决中文压缩与解压问题
使用的是org.apache.tools.zip包下面的相关类
下面是自己写的类,可以设置和获取Zip文件的注释信息
Java代码
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; public class ZipUtil { private String comment = ""; public void setComment(String comment) { this.comment = comment; } public void zip(String src, String dest, List filter) throws Exception { ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dest)); File srcFile = new File(src); zip(out,srcFile,"",filter); out.close(); } public void zip(ZipOutputStream out, File srcFile, String base, List filter) throws Exception { if(srcFile.exists()==false) { throw new Exception("压缩目录不存在!"); } if(srcFile.isDirectory()) { File[] files = srcFile.listFiles(); base = base.length() == 0 ? "" : base + "/"; if (isExist(base, filter)) { out.putNextEntry(new ZipEntry(base)); } for(int i=0; i<files.length; i++) { zip(out,files[i],base + files[i].getName(),filter); } } else { if (isExist(base, filter)) { base = base.length() == 0 ? srcFile.getName() : base ; ZipEntry zipEntry = new ZipEntry(base); zipEntry.setComment(comment); out.putNextEntry(zipEntry); FileInputStream in = new FileInputStream(srcFile); int length = 0; byte[] b = new byte[1024]; while((length=in.read(b,0,1024))!=-1) { out.write(b,0,length); } in.close(); } } } public boolean isExist(String base, List list) { if (list != null && !list.isEmpty()) { for (int i = 0; i < list.size(); i++) { if (base.indexOf((String) list.get(i)) >= 0) { return true; } } } return false; } public void unZip(String srcFile,String dest,boolean deleteFile) throws Exception { File file = new File(srcFile); if(!file.exists()) { throw new Exception("解压文件不存在!"); } ZipFile zipFile = new ZipFile(file); Enumeration e = zipFile.getEntries(); while(e.hasMoreElements()) { ZipEntry zipEntry = (ZipEntry)e.nextElement(); if(zipEntry.isDirectory()) { String name = zipEntry.getName(); name = name.substring(0,name.length()-1); File f = new File(dest + name); f.mkdirs(); } else { File f = new File(dest + zipEntry.getName()); f.getParentFile().mkdirs(); f.createNewFile(); InputStream is = zipFile.getInputStream(zipEntry); FileOutputStream fos = new FileOutputStream(f); int length = 0; byte[] b = new byte[1024]; while((length=is.read(b, 0, 1024))!=-1) { fos.write(b, 0, length); } is.close(); fos.close(); } } if (zipFile != null) { zipFile.close(); } if(deleteFile) { file.deleteOnExit(); } } public static String getZipComment(String srcFile) { String comment = ""; try { ZipFile zipFile = new ZipFile(srcFile); Enumeration e = zipFile.getEntries(); while (e.hasMoreElements()) { ZipEntry ze = (ZipEntry) e.nextElement(); comment = ze.getComment(); if (comment != null && !comment.equals("") && !comment.equals("null")) { break; } } zipFile.close(); } catch (Exception e) { System.out.println("获取zip文件注释信息失败:" + e.getMessage()); } return comment; } public static void main(String[] args) throws Exception { long begin = System.currentTimeMillis(); ZipUtil zu = new ZipUtil(); List<String> filter = new ArrayList<String>(); filter.add("3RDPARTY"); filter.add("BANNER.GIF"); zu.setComment("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); zu.zip("C:/VALUEADD", "c:/hh.zip",filter); System.out.println(ZipUtil.getZipComment("c:/hh.zip")); //new ZipUtil().unZip("c:/tt.zip", "c:/mmmmmmmmmmmmmmmmmmm/", true); //File f = new File("c:/hh.zip"); //f.deleteOnExit(); long end = System.currentTimeMillis(); System.out.println(end-begin); } } 如果不需要上面的filter,可以添加fileter为空list或者用下面的程序: 不带filter的zip压缩: // // * @author WeiMiao // * @param out: ZipOutputStream // * @param srcFile: 要压缩的目录 // * @param base: 根路径 // * @throws Exception // public static void zip(ZipOutputStream out, File srcFile, String base) throws Exception { if (!srcFile.exists()) { throw new Exception("压缩目录不存在!"); } if (srcFile.isDirectory()) { File[] files = srcFile.listFiles(); base = base.length() == 0 ? "" : base + "/"; if (base.length() > 0) { out.putNextEntry(new ZipEntry(base)); } for (int i = 0; i < files.length; i++) { zip(out, files[i], base + files[i].getName()); } } else { base = base.length() == 0 ? srcFile.getName() : base; out.putNextEntry(new ZipEntry(base)); FileInputStream fis = new FileInputStream(srcFile); int length = 0; byte[] b = new byte[BUFFER]; while ((length = fis.read(b, 0, BUFFER)) != -1) { out.write(b, 0, length); } fis.close(); } }
- Java实现Zip压缩与解压(解决中文乱码问题)
- Java实现Zip压缩与解压(解决中文乱码问题)
- PHP解压ZIP压缩包,解决中文乱码问题
- Java中ZIP压缩与解压--中文文件名乱码解决办法
- java实现解压(zip和rar文件)实例-解决中文乱码问题
- Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)
- 使用java实现压缩/解压(可以解决中文乱码)
- zip解压中文乱码解决与使用ant实现zip解压缩
- zip解压中文乱码解决与使用ant实现zip解压缩
- JAVA API实现ZIP压缩与解压
- java压缩zip文件中文乱码问题
- java zip压缩 解压 乱码 解决(好用)
- android 解压zip与rar--解决多级目录与中文乱码问题
- 解决ubuntu中zip解压的中文乱码问题
- ubuntu 解决zip解压出现中文乱码问题
- Ubuntu中解决解压zip文件中文乱码问题
- 解决ubuntu中zip解压的中文乱码问题
- ubuntu下解决解压zip文件中文文件名乱码问题
- 敏捷开发模式
- Hibernate的load()、get()、list()、iterator()方法的区别
- 去除空格SQL
- 将 Chrome 作为圣诞礼物送给那些使用 IE 的老顽固吧
- QT中文乱码
- Java实现Zip压缩与解压(解决中文乱码问题)
- js正则限制input框输入的常用代码
- mysql 的日志的启动与查看
- .Net 标签(Attribute) 背景介绍
- group by 分组查询 返回多列问题
- 比尔·盖茨为什么下注核能
- TCP/IP的四元组、五元组、七元组
- 等概率的抽取一个四位数 ,每次取一个,共取4次,4次组成一个4位数,拼起来为Set中的数
- jquery ajax跨域