解决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(); } } } }
以上代码经过测试,可以直接使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: leetcode刷题记录(22)-中等