支持中文的zip压缩和解压,修改自带jdk ZipInputStream、ZipOutputStream、ZipEntry代码

来源:互联网 发布:淘宝充值可以代付吗 编辑:程序博客网 时间:2024/05/20 14:23

        用过jdk自带的压缩或解压想必大家都知道不支持中文

        之前介绍了利用java.util.zip这个package里的class来完成压缩及解压缩的工作,但是我们知道,java对於文字的编码是以unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗!但是,现在市面上的压缩及解压缩软体,例如winzip,却是不支援unicode的,一碰到档名以unicode编码的档案,它就不处理。

       那要如何才能做出让winzip能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改: 

      这里我上传了我修改后的附件,大家可以下载下来放到项目中让jdk也zip也支持中文 http://download.csdn.net/detail/zou_hailin226/5304571

这里我直接代码搬出来给大家看


package zip;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import jdk.CNZipInputStream;import jdk.CNZipOutputStream;import jdk.ZipEntry;public class ZipCaoZuo {/*这里需要注意一下就是导入的包CNZipInputStream、CNZipOutputStream、ZipEntry 一定要用修改后的包*//**解压方法 * @param bytes 压缩后的文件字节流 * @return Map<文件名,文件字节流> * @throws Exception */public static Map<String, byte[]> jieYa(byte[] bytes)throws Exception{Map<String, byte[]> map = new HashMap<String, byte[]>();ByteArrayInputStream bis = new ByteArrayInputStream(bytes);CNZipInputStream zip = new CNZipInputStream(bis,"GB2312");//GB2312是简体中文、如果要用繁体中文的可以用BIG5ZipEntry entry = null;while((entry = zip.getNextEntry())!= null){String entryName = entry.getName();ByteArrayOutputStream output = new ByteArrayOutputStream();int i =0;while((i=zip.read())!=-1){output.write(i);}map.put(entryName, output.toByteArray());output.flush();output.close();}zip.closeEntry();zip.close();bis.close();return map;}/**压缩方法 * @param map  Map<文件名,文件字节流> * @return byte[] * @throws Exception */public static byte[] yaSuo(Map<String, byte[]> map)throws Exception{ByteArrayOutputStream fileOutput = new ByteArrayOutputStream();CNZipOutputStream out = new CNZipOutputStream(fileOutput);out.setMethod(CNZipOutputStream.DEFLATED);        Set<String> key = map.keySet();        for (Iterator it = key.iterator(); it.hasNext();) {            String fileName = (String) it.next();            byte[] file = map.get(fileName);            if(file == null){            continue;            }            out.putNextEntry(new ZipEntry(fileName));            out.write(file,0,file.length);             out.closeEntry();        }out.flush();out.close();fileOutput.flush();fileOutput.close();return fileOutput.toByteArray();}}

顺便上传一个图片方便大家理解