让ZipOutputStream和ZipInputStream支持中文

来源:互联网 发布:淘宝开店步骤教程视频 编辑:程序博客网 时间:2024/05/27 12:22
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>这一篇其实是延续「压缩与解压缩」相关系列文章的中文档名处理问题。 之前介绍了利用java.util.zip这个package里的class来完成压缩及解压缩的工作,但是我们知道,java对於文字的编码是以unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗! 但是,现在市面上的压缩及解压缩软体,例如winzip,却是不支援unicode的,一碰到档名以unicode编码的档案,它就不处理。 那要如何才能做出让winzip能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改: 一、ZipOutputStream.java 1.从jdk的src.zip取得ZipOutputStream.java原始码,另存新档存到c:/java/util/zip这个资料夹里,档名改为CZipOutputStream.java。 2.开始修改原始码,将class名称改为CZipOutputStream 3.建构式也必须更改为CZipOutputStream 4.新增member,这个member记录编码方式 private String encoding="UTF-8"; 5.再新增一个建构式(这个建构式可以让这个class在new的时候,设定档名的编码) public CZipOutputStream(OutputStream out,String encoding) { super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); usesDefaultDeflater = true; this.encoding=encoding; } 6.找到byte[] nameBytes = getUTF8Bytes(e.name);(有二个地方),将它修改如下: byte[] nameBytes = null; try { if (this.encoding.toUpperCase().equals("UTF-8")) nameBytes =getUTF8Bytes(e.name); else nameBytes= e.name.getBytes(this.encoding); } catch(Exception byteE) { nameBytes=getUTF8Bytes(e.name); } 7.将档案储存在c:/java/util/zip这个资料夹内,请记得一定要有这个路径结构, 才能把CZipOutputStream.class放在正确的package结构里 二、ZipInputStream.java 1.从jdk的src.zip取得ZipInputStream.java原始码,另存新档存到c:/java/util/zip这个资料夹里,档名改为CZipInputStream.java。 2.开始修改原始码,将class名称改为CZipInputStream 3.建构式也必须更改为CZipInputStream 4.新增member,这个member记录编码方式 private String encoding="UTF-8"; 5.再新增一个建构式如下(这个建构式可以让这个class在new的时候,设定档名的编码) public CZipInputStream(InputStream in,String encoding) { super(new PushbackInputStream(in,512),new Inflater(true),512); usesDefaultInflater = true; if(in == null) { throw new NullPointerException("in is null"); } this.encoding=encoding; } 6.找到ZipEntry e = createZipEntry(getUTF8String(b, 0, len));这一行,将它改成如下: ZipEntry e=null; try { if (this.encoding.toUpperCase().equals("UTF-8")) e=createZipEntry(getUTF8String(b, 0, len)); else e=createZipEntry(new String(b,0,len,this.encoding)); } catch(Exception byteE) { e=createZipEntry(getUTF8String(b, 0, len)); } 7.将档案储存在c:/java/util/zip这个资料夹内,请记得一定要有这个路径结构,才能把CZipInputStream.class放在正确的package结构里 以上两个档案储存後compile产生CZipOutputStream.class及CZipInputStream.class,使用winzip开启[java_home]/jre/lib/rt.jar这个档案,将CZipOutputStream.class及CZipInputStream.class加进去,记得「Save full path info」一定要打勾。 以後当压缩及解压缩时有中文档名及路径的问题时,就可以指定编码方式来处理了。 CZipOutputStream zos=new CZipOutputStream(OutputStream os,String encoding);CZipInputStream zins=new CZipInputStream(InputStream ins,String encoding);以「压缩与解压缩(1)」为例:FileOutputStream fos =new FileOutputStream(request.getRealPath("/") "myzip.zip");CZipOutputStream zos=new CZipOutputStream(fos,"BIG5");其他地方都不用改,便可以处理中文档名的压缩。----------------------------------------------------------------------------------------------------------------------------------------------------------------此文章来自台湾的jsp学习网,用的是繁体中文编码"BIG5",如果简体的话改为"GB2312"编码即可,压缩和解压缩具体步骤比较简单,看看java文档就会了,这里就不再罗嗦了。如果有不明白的地方可以按照上面网址的链接去看一下原文的网站,这个网站真的很好,相信你看过之后会和我有同样的感觉的!!!还有就是如果对此篇文章有什么异议的话,请给我发邮件我的邮箱地址是:wangwp@mailer.com.cn 欢迎大家踊跃的讨论和学习,共同进步是我的心愿。
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 云南楚雄高级技工学校 云南招聘网 楚雄 云南楚雄招聘信息网 楚雄市酒店查询 楚雄市公共资源交易中心 云南省楚雄市房价 楚雄市规划局 楚雄市在哪 楚雄市有几个县 云南省楚雄市酒店 云南楚雄属于哪个市 云南楚雄市酒店 楚雄市有哪些县 楚雄市是哪个省的 楚雄市在哪个省 楚雄市是哪个省 楚雄活动房 楚雄房网 楚雄买房 楚雄信息港首页 新楚雄信息港 楚雄求职网 楚雄人才招聘网 楚雄市招标网 楚雄招标网 楚雄州人才招聘网 楚雄租房信息网 楚雄人才网招聘信息 楚雄相亲网 楚雄同城网 楚雄工程信息网 楚雄人力资源和社会保障网 云南楚雄人才网 楚雄师范学院校园网首页 楚雄交友网 云南楚雄招聘网 苏柔楚枫 苏柔楚枫免费阅读 楚雨荨 楚雨荨骂猪的话 楚雨荨台词