`

Java中解压文件名有中文的rar包出现乱码问题的解决

    博客分类:
  • Java
 
阅读更多

之前一直在用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包。

分享到:
评论
10 楼 lannerK 2013-07-03  
楼主,不用写这种方法判断啊,
FileHeader 有个方法是判断文件名是不是Unicode字符,如果是的话要用
getFileNameW
你这个只能解决中文的乱码,不能解决其他 Unicode文件名的乱码,所以正确应该
这样写

String entrypath = "";
if(fh.isUnicode()){
  entrypath = fh.getFileNameW().trim();
}else{
  entrypath = fh.getFileNameString().trim();  
}
9 楼 大象06 2013-05-16  
Kevin_fan 写道
太感谢了,帮我解决乱码问题。 关键在于楼主查API。 你是怎么查的呢?

这能怎么查嘛,就是用代码提示去看有没有类似的方法的。
8 楼 Kevin_fan 2013-05-15  
太感谢了,帮我解决乱码问题。 关键在于楼主查API。 你是怎么查的呢?
7 楼 大象06 2013-04-03  
songjiesdnu 写道
非常感谢楼主,解决了我的一个大问题。
另外,楼主的这段代码还有点小的问题,我也是在尝试解决自己问题的过程中发现的。
主要是55行,由于没有对extPlace 和 fileName进行路径分割符进行替换,导致后面使用fileName的时候,还是会出现文件名中含有"\"分隔符。所以,在55行前,我添加了一下两句:
extPlace = extPlace.replaceAll("\\\\", File.separator);
fileName = fileName.replaceAll("\\\\", File.separator);
问题解决。

另外,对于"\"的替换,使用replaceAll("\\\\", File.separator)是不是更好呢?

再次感谢楼主!!

是的,感谢你的提示,很有道理!
6 楼 songjiesdnu 2013-04-02  
非常感谢楼主,解决了我的一个大问题。
另外,楼主的这段代码还有点小的问题,我也是在尝试解决自己问题的过程中发现的。
主要是55行,由于没有对extPlace 和 fileName进行路径分割符进行替换,导致后面使用fileName的时候,还是会出现文件名中含有"\"分隔符。所以,在55行前,我添加了一下两句:
extPlace = extPlace.replaceAll("\\\\", File.separator);
fileName = fileName.replaceAll("\\\\", File.separator);
问题解决。

另外,对于"\"的替换,使用replaceAll("\\\\", File.separator)是不是更好呢?

再次感谢楼主!!
5 楼 qbl_experience 2013-02-01  
不错,非常好
4 楼 huzhenkui 2012-08-07  
谢谢分享,这个问题困扰我了两天了,终于解决了rar在linux上解压的乱码问题!
3 楼 chero 2012-06-11  
  非常不错!非常详细。
2 楼 NBUsher 2012-03-31  
找的就是它!!谢谢
1 楼 jian1120java 2012-02-21  
非常不错!非常详细。

相关推荐

    文件解压和压缩 解决中文乱码

    这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...

    java解决压缩中文乱码

    在Java编程中,当涉及到文件压缩操作时,经常会遇到一个问题:中文字符在压缩过程中出现乱码。这主要是因为Java的标准库`java.util.zip`在处理非ASCII编码的字符时存在局限性。不过,通过一些技巧和自定义实现,我们...

    ZipUtil文件压缩工具类(解决中文乱码)

    总之,`ZipUtil`文件压缩工具类通过结合`ZipEntry`和`ZipOutputStream`,提供了一种高效且健壮的解决方案,尤其适合处理包含中文字符的文件和目录,确保在压缩和解压过程中不会出现乱码问题。这对于需要在Java应用...

    解压文件时中文乱码

    在处理压缩文件,如ZIP或RAR格式时,中文文件名可能会出现乱码问题,这通常是由于编码不兼容或缺少正确设置编码导致的。中文字符在不同的操作系统或软件中可能使用不同的编码方式,如GBK、UTF-8等,不匹配就会产生...

    java解压zip或rar压缩文件源码与jar包

    这篇描述提到了一个接口类,专门用于解决解压过程中可能出现的乱码问题。以下将详细讲解Java中解压ZIP和RAR文件的方法,以及如何处理乱码。 1. **Java解压ZIP文件**: - Java标准库提供了`java.util.zip`包,其中...

    Java ZIP压缩一个或多个文件(解决中文名称乱码).rar

    用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。

    Java带密码解压缩RAR压缩包(内附代码)

    在Java编程环境中,处理RAR压缩包并对其进行解压是一个常见的任务,特别是在自动化脚本或数据迁移等场景下。本文将详细介绍如何使用Java实现这个功能,特别是处理带密码保护的RAR文件,同时支持中文文件名,并能在...

    取压缩包中(RAR)全部文件名.rar

    在处理非ASCII字符时,需注意正确识别和转换文件名的编码,以免出现乱码问题。 9. **批量处理**:如果你需要处理大量RAR文件,可以编写脚本或利用支持批处理的工具,一次性获取所有文件的名称,提高工作效率。 10....

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

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

    安卓文件下载上传解压相关-javaandroidzip解压缩解决压缩中文乱码问题).rar

    本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...

    java压缩包解压

    本文将深入探讨如何在Java中实现解压缩功能,以及解决在处理包含中文文件名时可能出现的乱码问题。 首先,Java提供了`java.util.zip`包,它包含了处理ZIP文件的相关类。我们主要使用`ZipInputStream`和`ZipEntry`来...

    linux、window通用文件解压

    解压含中文文件名的压缩包时,可能会遇到编码问题。确保在Linux上你的系统locale支持UTF-8,而在Windows上,确保系统区域和语言设置正确。如果遇到问题,可能需要使用支持多语言编码的解压工具,比如7-Zip。 5. **...

    upZipFile.rar

    本文将深入探讨如何解决在处理ZIP压缩文件时遇到的中文文件名乱码问题,以及如何构建一个有效的解压示例。 ZIP是一种广泛使用的文件压缩格式,由Phil Katz在1989年创建。它允许将多个文件和目录打包成一个单一的可...

    安卓文件下载上传解压相关-andorid采用post方法把文件传输到自己写的服务器并解决了文件中文编码问.rar

    Java默认使用ISO-8859-1编码,这可能导致中文乱码。解决方案是在读写文件名时指定正确的编码格式,如UTF-8。在发送HTTP请求时,确保设置合适的`Content-Type`,如`application/x-www-form-urlencoded; charset=UTF-8...

    java文件解压缩工具箱及案例

    本主题将深入探讨如何使用Java来创建一个文件解压缩工具箱,特别关注支持ZIP和RAR格式,并解决中文乱码问题。首先,我们需要了解两个核心库:`java-unrar-1.7.0-1.jar` 和 `ant-1.8.2.jar`。 `java-unrar-1.7.0-1....

    Unzip_demo.rar

    由于早期的ZIP规范不强制要求文件名使用特定的字符集,可能会导致在不同系统之间解压时出现乱码。因此,我们需要确保在读取文件名时使用正确的字符编码,通常是UTF-8。 以下是一个基本的解压缩流程: 1. **打开ZIP...

    利用ant.jar解压缩zip包

    特别值得注意的是,这个工具类声称能解决中文文件名的问题。在处理非英文字符时,Ant库通常能较好地处理编码问题,避免常见的乱码错误。然而,为了确保万无一失,你可能还需要检查你的项目配置,确保文件系统和Ant都...

    kaiti_GB2312.zip

    2. **编码转换**:在处理GB2312编码的文本时,确保文本编辑器或处理程序设置正确,避免出现乱码问题。如果需要在GB2312和UTF-8等编码之间转换,可以使用专门的转换工具或编程语言的相关函数。 3. **跨平台兼容性**...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

Global site tag (gtag.js) - Google Analytics