当前位置: 移动技术网 > IT编程>开发语言>Java > 解决Java原生压缩组件不支持中文文件名乱码的问题

解决Java原生压缩组件不支持中文文件名乱码的问题

2019年07月22日  | 移动技术网IT编程  | 我要评论

最近发现java原生的zip压缩组件在压缩过程中,不支持文件名的中文编码,会在压缩过程中把中文文件名变成乱码。apache的ant包中的压缩组件修复了这个问题,如果你在使用压缩功能时需要支持中文文件名,建议你直接使用apache的压缩组件来实现这个功能。

具体使用方法:

1.在你的pom文件中增加对apache的ant工具包的dependency:

    <dependency>
      <groupid>org.apache.ant</groupid>
      <artifactid>ant</artifactid>
      <version>1.9.3</version>
    </dependency>

并在头部引用用到的类:

import org.apache.tools.zip.zipentry;
import org.apache.tools.zip.zipfile;
import org.apache.tools.zip.zipoutputstream;

2.压缩的方法实现,大家注意,本组件支持设置编码(setencoding("gbk")方法),解决了中文编码的问题:

public static void compress(string srcpath , string dstpath) throws ioexception{
    file srcfile = new file(srcpath);
    file dstfile = new file(dstpath);
    if (!srcfile.exists()) {
      throw new filenotfoundexception(srcpath + "does not exists");
    }

    fileoutputstream out = null;
    zipoutputstream zipout = null;
    try {
      out = new fileoutputstream(dstfile);
      zipout = new zipoutputstream(new bufferedoutputstream(out));
      zipout.setencoding("gbk");
      string basedir = "";
      compress(srcfile, zipout, basedir);
    }
    catch (throwable ex){
      throw new runtimeexception(ex);
    }
    finally {
      if(null != zipout){
        zipout.close();
        out = null;
      }

      if(null != out){
        out.close();
      }
    }
  }


private static void compress(file file, zipoutputstream zipout, string basedir) throws ioexception{
    if (file.isdirectory()) {
      compressdirectory(file, zipout, basedir);
    } else {
      compressfile(file, zipout, basedir);
    }
  }

  /** 压缩一个目录 */
  private static void compressdirectory(file dir, zipoutputstream zipout, string basedir) throws ioexception{
    file[] files = dir.listfiles();
    for (int i = 0; i < files.length; i++) {
      compress(files[i], zipout, basedir + dir.getname() + "/");
    }
  }

  /** 压缩一个文件 */
  private static void compressfile(file file, zipoutputstream zipout, string basedir) throws ioexception{
    if (!file.exists()){
      return;
    }

    bufferedinputstream bis = null;
    try {
      bis = new bufferedinputstream(new fileinputstream(file));
      zipentry entry = new zipentry(basedir + file.getname());
      zipout.putnextentry(entry);
      int count;
      byte data[] = new byte[buffer];
      while ((count = bis.read(data, 0, buffer)) != -1) {
        zipout.write(data, 0, count);
      }

    }finally {
      if(null != bis){
        bis.close();
      }
    }
  }

3.解压缩的实现:

public static void decompress(string zipfile , string dstpath)throws ioexception{
    file pathfile = new file(dstpath);
    if(!pathfile.exists()){
      pathfile.mkdirs();
    }
    zipfile zip = new zipfile(zipfile);
    for(enumeration entries = zip.getentries();entries.hasmoreelements();){
      zipentry entry = (zipentry)entries.nextelement();
      string zipentryname = entry.getname();
      inputstream in = null;
      outputstream out = null;
      try{
        in = zip.getinputstream(entry);
        string outpath = (dstpath+"/"+zipentryname).replaceall("\\*", "/");;
        //判断路径是否存在,不存在则创建文件路径
        file file = new file(outpath.substring(0, outpath.lastindexof('/')));
        if(!file.exists()){
          file.mkdirs();
        }
        //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
        if(new file(outpath).isdirectory()){
          continue;
        }

        out = new fileoutputstream(outpath);
        byte[] buf1 = new byte[1024];
        int len;
        while((len=in.read(buf1))>0){
          out.write(buf1,0,len);
        }
      }
      finally {
        if(null != in){
          in.close();
        }

        if(null != out){
          out.close();
        }
      }
    }
  }

以上代码经过测试,可以直接使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网