`
gybin
  • 浏览: 264361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ZipInputStream解压有中文名的zip包

    博客分类:
  • Java
阅读更多
ZipInputStream解压有中文名的zip包
2008-08-01 13:36
下午闲来没事做,就想解决一下很久以前的一个问题,那就是java.util.zip.ZipInputStream解压文件的时候,如果包里有中 文名的文件,那报错,弄了一会儿,竟然解决了,不用像以前在网上查到的要重新编译jdk的。(jdk:sun jdk1.4.2)

1.重建zip包

新建一个自己的zip包,比如com.agile.zip,在这个包中把要用到的类从jdk的源码里放到这里,用eclipse可以很同快地完成这 个工作。需要所类 有:DeflaterOutputStream,InflaterInputStream,ZipConstants,ZipEntry,ZipInputStream,ZipOutputStream

上面这些类在放到com.aigle.zip包中后,在Eclipse中会显示出一些错误,这里要做得就是更改import以及其它一些工作,惟一的目的就是通过编译,不再出现编译错误。

2.修改ZipInputStream

ZipInputStream这个类中,需要修改getUTF8String这个方法,经过试验,用winRar压缩后的zip文件,其中的中文文件名是以gbk编码保存的,因此只需要在这个方法的前面加上

try {
    String s = new String(b,off,len,"gbk");
    return s;
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   }
修改后的方法类似下面的代码:

private static String getUTF8String(byte[] b, int off, int len) {
   try {
    String s = new String(b,off,len,"gbk");
    return s;
   } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
   }
   // First, count the number of characters in the sequence
   int count = 0;
   int max = off + len;

...

...

}

3.去掉一些本地调用方法

原来的java.util.zip.ZipEntry里面,要加载本地库,在这里这些代码是没有用处的,去掉就可以了,而如果不去掉,会引起链接错误,很奇怪,这几个native方法我也没有找到在哪儿使用了,sun的jdk1.4.2里留着它们做什么呢?

static {
        /* load the zip library */
java.security.AccessController.doPrivileged(
    new sun.security.action.LoadLibraryAction("zip"));
initIDs();
    }

4.测试

代码:这里是我修改后的zip包

加入解压缩测试代码文件名为unziptest.java:
/**
*
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import com.agile.zip.ZipEntry;
import com.agile.zip.ZipInputStream;
/**
* @author lianjzh
*
*/
public class unziptest {

static final int BUFFER = 2048;
    public static void main(String argv[]) {
        try {
            unziptest uz=new unziptest();
            String zippath = "d:\\unzip\\";// /解压到的目标文件路径
         String zipDir = "d:\\abc.zip";// 要解压的压缩文件的存放路径
        
          File file = new File(zipDir);
         
          String realname = file.getName();
          System.out.println(realname);
          int end = realname.lastIndexOf(".");
          System.out.println("要解压缩的文件名.........."+zipDir);
          System.out.println("解压到的目录" +zippath);
          uz.ReadZip(zippath,zipDir);
         
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    public void ReadZip(String zippath, String unzipPath) throws Exception {
    try {
            BufferedOutputStream dest = null;
            FileInputStream fis = new
                                  FileInputStream(unzipPath);//"d:\\abc.zip"
            ZipInputStream zis = new
                                 ZipInputStream(new BufferedInputStream(fis));
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                System.out.println("Extracting: " + entry);
                int count;
                byte data[] = new byte[BUFFER];
               
                if (entry.isDirectory())// 如果为目录条目,则返回 true,执行下列语句
             {
              System.out.println("Dir: " + entry.getName() + " skipped..");
              continue;
             }
               
                int begin = unzipPath.lastIndexOf("\\") + 1;
             int end = unzipPath.lastIndexOf(".");
             String zipRealName = unzipPath.substring(begin, end);
// write the files to the
               
            dest = new BufferedOutputStream(
                new FileOutputStream(getRealFileName(zippath + "\\"
                  + zipRealName, entry.getName())));
            
               
             
               // FileOutputStream fos = new
                 //                      FileOutputStream(wholepath);
               
               
                //dest = new
                 //      BufferedOutputStream(fos, BUFFER);
                while ((count = zis.read(data, 0, BUFFER))
                                != -1) {
                    dest.write(data, 0, count);
                }
                dest.flush();
                dest.close();
            }
            zis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
   
    }
    /**
   * 给定根目录,返回一个相对路径所对应的实际文件名.
   *
   * @param zippath
   *            指定根目录
   * @param absFileName
   *            相对路径名,来自于ZipEntry中的name
   * @return java.io.File 实际的文件
   */
private File getRealFileName(String zippath, String absFileName) {

   String[] dirs = absFileName.split("/", absFileName.length());

   File ret = new File(zippath);// 创建文件对象

   if (dirs.length > 1) {
    for (int i = 0; i < dirs.length - 1; i++) {
     ret = new File(ret, dirs[i]);

    }
   }

   if (!ret.exists()) {// 检测文件是否存在
    ret.mkdirs();// 创建此抽象路径名指定的目录
   }
   ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
              // 路径名字符串创建一个新 File 实例

   return ret;
}

}
分享到:
评论
1 楼 xiaohuafyle 2012-08-22  
没有附件下载的么?

相关推荐

    ZipInputStream解压有中文名报错问题解决

    对jdk内置的zip解压缩存在bug 如果zip文件里有中文文件,会报错 现在把这个问题解决。

    java 支持中文解压:一行代码解决 java.util.zip.ZipInputStream 中文乱码;--文件处理通用类

    1、文件解压zip通用机制方法、一行代码支持中文; 2、一行代码解决 java.util.zip.ZipInputStream 中文乱码; 3、删除指定路径内的所有文件通用机制方法;

    使用java代码替换zip内的文件.docx

    有些时候需要替换zip内的文件。 网上的办法大多是——先解压,然后对解压目录替换文件,最后再重新压缩。该办法需要比较繁琐,且需要一个临时目录。 于是想找无需解压的方案。 后来找到利用 ZipInputStream、...

    Java实现文件的压缩和解压

    基于GUI用IO流中的ZipOutputStream ,ZipInputStream实现文件的解压与压缩, 如文件解压函数如下 private void unZip(String zipFileName, String outputDirectory)throws Exception { InputStream in=null; ...

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    java后台解压压缩文件

    前端上传ZIP压缩文件 使用 ZipInputStream 来解压至指定目录中.

    zip4j.jar包下载 包含zip4j-2.9.0版本和zip4j-1.3.1版本的j两个jar包,亲试均可用

    支持流(ZipInputStream和ZipOutStream) 读/写受密码保护的zip文件和流 支持AES和zip标准加密方法 支持Zip64格式 存储(无压缩)和放气压缩方法 从拆分的zip文件中创建或提取文件(例如:z01、z02、…zip) 在zip...

    C# WPF 解压缩7zip文件 带进度条

    C# WPF 解压缩7zip文件 带进度条 sevenzipsharp WPF PNG实现的图形进度条 .NET 3.5 vs2013打开 来这里看介绍 http://www.cnblogs.com/xe2011/p/3761870.html

    java解压乱码问题修正

    JAVA中文件压缩引起的乱码问题,是由于Java编码以Unicode 为基础的,所以ZipOutputStream(还有ZipInputStream) 处理压缩工作时,就以Unicode来处理中文。 所以为了能在压缩(或解压)时,不让其产生乱码问题,就得...

    java实现文件解压缩,ZipInputStream,ZipOutputStream

    java实现文件解压缩,ZipInputStream,ZipOutputStream

    zipme包---j2me的zip

    ZipInputStream This is a FilterInputStream that reads the files in an zip archive one after another. ZipOutputStream This is a FilterOutputStream that writes the files into a zip archive one after ...

    文件压缩与解压

    可以实现文件的压缩和解压 ZipFile zipInputStream ZipEntry zipOutputStream

    解决java压缩、解压缩含中文字符的文件或文件夹问题

    通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。

    zip压缩大全

    zip压缩相关 1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.IO; 5using ICSharpCode.SharpZipLib; 6using ICSharpCode.SharpZipLib.Zip; 7using ICSharpCode....

    java文件压缩和解压 源码

    java中通过ZipOutputStream和ZipInputStream实现了zip压缩和解压功能。java源码————资源共享,一起进步。

    java实现文件夹的解压和压缩

    效果 实现多个文件以及文件夹的压缩和解压 代码分析 import java.io.File; import java.io.FileInputStream;...import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class Mai

    C# 打包 zip

    ZipInputStream s = new ZipInputStream(File.OpenRead(filePath1)); ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string fullname = Server.MapPath("ziptemp/" + urlid + "/" + the...

    android、java、加密解压工具类库

    支持android和java加密压缩、解压封装好的类库,代码可以参考http://www.cnblogs.com/cmf34263/ 【java加密解压类库】文章

    用于中文乱码解压和压缩

    因为本人工作需要解压文件,但是出现中文乱码,但是又不想用ant.jar 所以就只有将zipInputStream更改。当然我是转载别人的,经测试可以使用哦,哈哈 http://zwllxs.iteye.com/blog/871260 这是地址

    JAVA文件压缩与解压缩的设计与实现(源代码+论文)

    ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。 ZipOutputStream 实现文件的压缩 ...

Global site tag (gtag.js) - Google Analytics