JAVA使用 java-unrar-0.3.jar 解压rar,并且解决中文乱码_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JAVA使用 java-unrar-0.3.jar 解压rar,并且解决中文乱码

JAVA使用 java-unrar-0.3.jar 解压rar,并且解决中文乱码

 2013/7/10 3:35:30  lannerK  程序员俱乐部  我要评论(0)
  • 摘要:有个项目需要解压rar,上网搜索一下大家都在用java-unrar-0.3.jar,于是写了一个util方法解压rarpublicstaticvoidunrar(StringsrcPath,StringunrarPath,booleanincRarDir)throwsRarException,IOException{unrar(newFile(srcPath),unrarPath,incRarDir);}publicstaticvoidunrar(FilesrcFile
  • 标签:解决 使用 Java 文乱码

有个项目需要解压rar,上网搜索一下大家都在用? java-unrar-0.3.jar ,于是写了一个util方法解压rar

?

class="java" name="code">	public  static void unrar(String srcPath,String unrarPath,boolean incRarDir) throws RarException, IOException{
		unrar(new File(srcPath), unrarPath, incRarDir);
	}
	
	public  static void unrar(File srcFile,String unrarPath,boolean incRarDir) throws RarException, IOException{
		if(StringUtil.isEmptyString(unrarPath)){
			unrarPath = srcFile.getParentFile().getPath();
		}
		if(incRarDir){
			File dir = new File(unrarPath+"/"+FileUtil.getFileNameWithoutType(srcFile.getName()));
			dir.mkdir();
			unrarPath = dir.getPath();
		}
		System.out.println("unrar file to :"+unrarPath);
        FileOutputStream fileOut;
        File file;    
        Archive rarfile = new Archive(srcFile);
        FileHeader entry = rarfile.nextFileHeader();
        while(entry!=null){
        	
        	String entrypath = entry.getFileNameString().trim();  

        	entrypath=entrypath.replaceAll("\\\\", "/");
        	
        	file = new File(unrarPath+"/"+entrypath);
        	System.out.println("unrar entry file :"+file.getPath());
        	if(entry.isDirectory()){
        		file.mkdirs();
        	}else{
            	File parent = file.getParentFile();
                if(parent!=null && !parent.exists()){
                    parent.mkdirs();
                }
                fileOut = new FileOutputStream(file);
                rarfile.extractFile(entry, fileOut);
                fileOut.close();
        	}        	
        	entry = rarfile.nextFileHeader();
        }
        rarfile.close();
        
	}

?

?

经过验证,解压包中如果没有中文名是正常的,但是一旦带有中文名就出现乱码了,看了一下FileHeader类的方法提示,发现有个isUnicode的方法,估计是用来判断文件名是不是Unicode字符的,而且还有一个方法获得压缩包里的文件名的 getFileNameW,经过反复试验,应该这样写才能解决乱码问题

        	String entrypath = "";
        	if(entry.isUnicode()){//Unicode文件名使用getFileNameW
        		entrypath = entry.getFileNameW().trim();
        	}else{
        		entrypath = entry.getFileNameString().trim();  
        	}

?乱码问题解决

?最后附上正确的使用源码和 java-unrar-0.3.jar

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import de.innosystec.unrar.Archive;
import de.innosystec.unrar.exception.RarException;
import de.innosystec.unrar.rarfile.FileHeader;

public class RARUtil {
	
	public  static void unrar(String srcPath,String unrarPath,boolean incRarDir) throws RarException, IOException{
		unrar(new File(srcPath), unrarPath, incRarDir);
	}
	
	public  static void unrar(File srcFile,String unrarPath,boolean incRarDir) throws RarException, IOException{
		if(StringUtil.isEmptyString(unrarPath)){
			unrarPath = srcFile.getParentFile().getPath();
		}
		if(incRarDir){
			File dir = new File(unrarPath+"/"+FileUtil.getFileNameWithoutType(srcFile.getName()));
			dir.mkdir();
			unrarPath = dir.getPath();
		}
		System.out.println("unrar file to :"+unrarPath);
        FileOutputStream fileOut;
        File file;    
        Archive rarfile = new Archive(srcFile);
        FileHeader entry = rarfile.nextFileHeader();
        while(entry!=null){
        	
        	String entrypath = "";
        	if(entry.isUnicode()){
        		entrypath = entry.getFileNameW().trim();
        	}else{
        		entrypath = entry.getFileNameString().trim();  
        	}

        	entrypath=entrypath.replaceAll("\\\\", "/");
        	
        	file = new File(unrarPath+"/"+entrypath);
        	System.out.println("unrar entry file :"+file.getPath());
        	if(entry.isDirectory()){
        		file.mkdirs();
        	}else{
            	File parent = file.getParentFile();
                if(parent!=null && !parent.exists()){
                    parent.mkdirs();
                }
                fileOut = new FileOutputStream(file);
                rarfile.extractFile(entry, fileOut);
                fileOut.close();
        	}        	
        	entry = rarfile.nextFileHeader();
        }
        rarfile.close();
        
	}


}

?

  • java-unrar-0.3.jar (129.7 KB)
  • 下载次数: 13
发表评论
用户名: 匿名