Java中解压文件名有中文的rar包出现乱码有关问题的解决
Java中解压文件名有中文的rar包出现乱码问题的解决
非常不错!非常详细。
之前一直在用java-unrar-0.3.jar来解压rar文件包,一直很正常,但是今天来了个中文名字的包,类似于这样的结构:
压缩包.rar,这个压缩包里面还有个文件夹也叫压缩包,在解压这个压缩包的时候出现了乱码,研究了好久,已经解决,现与大家分享下。
原来解压文件的代码:
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import de.innosystec.unrar.Archive; import de.innosystec.unrar.exception.RarException; import de.innosystec.unrar.rarfile.FileHeader; /** * 对rar或者zip进行解压缩 * * @author yKF41624 * */ public class Decompress { private static String fileName = ""; /** * 对rar文件解压 * * @param rarFileName * @param extPlace * @return */ public static boolean unrarFiles(String rarFileName, String extPlace) { boolean flag = false; Archive archive = null; File out = null; File file = null; File dir = null; FileOutputStream os = null; FileHeader fh = null; String path, dirPath = ""; try { file = new File(rarFileName); archive = new Archive(file); } catch (RarException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } finally { if (file != null) { file = null; } } if (archive != null) { try { fh = archive.nextFileHeader(); while (fh != null) { fileName = fh.getFileNameString().trim(); path = (extPlace + fileName).replaceAll("\\\\", "/"); int end = path.lastIndexOf("/"); if (end != -1) { dirPath = path.substring(0, end); } try { dir = new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } } catch (RuntimeException e1) { e1.printStackTrace(); } finally { if (dir != null) { dir = null; } } if (fh.isDirectory()) { fh = archive.nextFileHeader(); continue; } out = new File(extPlace + fileName); try { os = new FileOutputStream(out); archive.extractFile(fh, os); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (RarException e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { out = null; } } fh = archive.nextFileHeader(); } } catch (RuntimeException e) { e.printStackTrace(); } finally { fh = null; if (archive != null) { try { archive.close(); } catch (IOException e) { e.printStackTrace(); } } } flag = true; } return flag; } }
以上代码解压无中文的压缩包是很正常的,经过调试发现,是在的文件名的时候如果含有中文那么得到的就是乱码,即是代码中的第54行:
fileName = fh.getFileNameString().trim();
最开始我查了下API,我发现有一个getFileNameW()方法,就尝试着用这个方法得到要解压的文件名,发现如果有中文一下就成功了,于是我把上面的方法替换成了这个,可是没想到如果来的压缩包没有英文,那么就得不到了,于是这就要加个判断。于是我通过正则表达式判断文件名中是否含有中文,如果有中文,调用getFileNameW(),如果没有中文就调用getFileNameString()方法,就解决了。
附上判断字符中是否存在中文的方法:
public static boolean existZH(String str) { String regEx = "[\\u4e00-\\u9fa5]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); while (m.find()) { return true; } return false; }
于是,只需要将原来的代码第54行修改为如下代码即可:
fileName= fh.getFileNameW().trim(); if(!existZH(fileName)){ fileName = fh.getFileNameString().trim(); }
最后在附上所用jar包。
1 楼
jian1120java
2012-02-21
非常不错!非常详细。
2 楼
NBUsher
2012-03-31
找的就是它!!谢谢
3 楼
chero
2012-06-11
4 楼
huzhenkui
2012-08-07
谢谢分享,这个问题困扰我了两天了,终于解决了rar在linux上解压的乱码问题!