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

        用过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是简体中文、如果要用繁体中文的可以用BIG5
		ZipEntry 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();
	}
}

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值