免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 886 | 回复: 0
打印 上一主题 下一主题

java zip 中文问题(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-17 10:14 |只看该作者 |倒序浏览
    个人说明 : java.util.zip.* 压缩解压文件包!不过这个包没解决中文文件名问题。以下是从网上找解决方案! 自我感觉采用org.apache.tools.zip是比较好的解决方案。

压缩程序 : 比较复杂,可以实现,递归程序!主要是压缩文件夹(要传文件名^_^)
解压程序 : 比较简单!

用ant解压包含中文文件名的压缩文件
中文问题是java中的普遍性问题.今天下午遇到一个包含中文文件名的压缩文件解压问题.找了不少资料.现贴出解集.
在java.util.zip包也可以用来处理解压问题,不过对含有中文文件名的压缩包无能为力,这是因为ZipOutputStream压缩和解压ZIP文件对文件名都是以UTF-8编码方式来处理的,而我们用winzip压缩文件对文件名只会以ASCII编码方式来处理.所以会出现编码不一致的问题.
有两种解决方案:
第一种就是修改ZipOutputStream,参考修改如下:(这个我没有测试过)
// 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));
}
再加一个
public ZipInputStream(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;
}
第二种方法就是用ant包,可以在官方网站http://ant.apache.org/bindownload.cgi下载,把ant.jar导入到类中.
参考用例如下:
public void unzip(String zipFileName,String outputDirectory) throws Exception{
try {
    org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(zipFileName);
    java.util.Enumeration e = zipFile.getEntries();
    org.apache.tools.zip.ZipEntry zipEntry = null;
    while (e.hasMoreElements()){
        zipEntry = (org.apache.tools.zip.ZipEntry)e.nextElement();
        System.out.println("unziping "+zipEntry.getName());
        if (zipEntry.isDirectory()){
            String name=zipEntry.getName();
            name=name.substring(0,name.length()-1);
            System.out.println("输出路径:"+outputDirectory+File.separator+name);
            File f1=new File(outputDirectory+File.separator);
f1.mkdir();
            File f=new File(outputDirectory+File.separator+name);
            f.mkdir();
            System.out.println("创建目录:"+outputDirectory+File.separator+name);
        }else{
            File f=new File(outputDirectory+File.separator+zipEntry.getName());
            f.createNewFile();
            InputStream in = zipFile.getInputStream(zipEntry);
            FileOutputStream out=new FileOutputStream(f);
            //--------解决了图片失真的情况
            int c;
            byte[] by=new byte[1024];
            while((c=in.read(by)) != -1){
                out.write(by,0,c);
            }
            out.close();
            in.close();
        }
    }
}
catch (Exception ex){
}
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22660/showart_172418.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP