之前介绍了利用javautilzip这个package里的class来完成压缩及解压缩的工作但是我们知道java对于文字的编码是以unicode为基础因此若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作碰到中文档名或路径那当然是以unicode来处理罗! 但是现在市面上的压缩及解压缩软体例如winzip却是不支援unicode的一碰到档名以unicode编码的档案它就不处理 那要如何才能做出让winzip能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对于档名的编码方式来着手了我们可以从jdk的srczip取得ZipInputStream及ZipOutputStream的原始码来加以修改 一ZipOutputStreamjava 从jdk的srczip取得ZipOutputStreamjava原始码另存新档存到c:\java\util\zip这个资料夹里档名改为CZipOutputStreamjava 开始修改原始码将class名称改为CZipOutputStream 建构式也必须更改为CZipOutputStream 新增member这个member记录编码方式 private String encoding=UTF; 再新增一个建构式(这个建构式可以让这个class在new的时候设定档名的编码) public CZipOutputStream(OutputStream outString encoding) { super(out new Deflater(DeflaterDEFAULT_COMPRESSION true)); usesDefaultDeflater = true; thisencoding=encoding; } 找到byte[] nameBytes = getUTFBytes(ename);(有二个地方)将它修改如下 byte[] nameBytes = null; try { if (thisencodingtoUpperCase()equals(UTF)) nameBytes =getUTFBytes(ename); else nameBytes= enamegetBytes(thisencoding); } catch(Exception byteE) { nameBytes=getUTFBytes(ename); } 将档案储存在c:\java\util\zip这个资料夹内请记得一定要有这个路径结构才能把CZipOutputStreamclass放在正确的package结构里 二ZipInputStreamjava 从jdk的srczip取得ZipInputStreamjava原始码另存新档存到c:\java\util\zip这个资料夹里档名改为CZipInputStreamjava 开始修改原始码将class名称改为CZipInputStream 建构式也必须更改为CZipInputStream 新增member这个member记录编码方式 private String encoding=UTF; 再新增一个建构式如下(这个建构式可以让这个class在new的时候设定档名的编码) public CZipInputStream(InputStream inString encoding) { super(new PushbackInputStream(in)new Inflater(true)); usesDefaultInflater = true; if(in == null) { throw new NullPointerException(in is null); } thisencoding=encoding; } 找到ZipEntry e = createZipEntry(getUTFString(b len));这一行将它改成如下 ZipEntry e=null; try { if (thisencodingtoUpperCase()equals(UTF)) e=createZipEntry(getUTFString(b len)); else e=createZipEntry(new String(blenthisencoding)); } catch(Exception byteE) { e=createZipEntry(getUTFString(b len)); } 将档案储存在c:\java\util\zip这个资料夹内请记得一定要有这个路径结构才能把CZipInputStreamclass放在正确的package结构里 以上两个档案储存后compile产生CZipOutputStreamclass及CZipInputStreamclass使用winzip开启[java_home]\jre\lib\rtjar这个档案将CZipOutputStreamclass及CZipInputStreamclass加进去记得「Save full path info」一定要打勾以后当压缩及解压缩时有中文档名及路径的问题时就可以指定编码方式来处理了 CZipOutputStream zos=new CZipOutputStream(OutputStream osString encoding); CZipInputStream zins=new CZipInputStream(InputStream insString encoding); 以「压缩与解压缩()」为例 FileOutputStream fos =new FileOutputStream(requestgetRealPath(/)+myzipzip); CZipOutputStream zos=new CZipOutputStream(fosBIG); 其他地方都不用改便可以处理中文档名的压缩 |