欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-05 23:40:25
最近发现java原生的zip压缩组件在压缩过程中,不支持文件名的中文编码,会在压缩过程中把中文文件名变成乱码。apache的ant包中的压缩组件修复了这个问题,如果你在使用...

最近发现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();
        }
      }
    }
  }

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

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