这是利用de.innosystec.unrar解压缩rar文件.(他不支持中文和日文.下面是经本人改进后支持双字节的.同时实现了跨平台)
/**
* unRar method, extract rar file
*
* @param file_src Archive File
* @param extractPath extract Path
* @return boolean
* @exception Exception
*/
private static boolean unRar(File file_src,String extractPath) {
String os = System.getProperty(Const.getString(propertyOS)).toLowerCase();
File extractToFolder = new File(extractPath);
ReadOnlyAccessFile readOnlyAccessFile=null;
Archive archive=null;
try {
readOnlyAccessFile = new ReadOnlyAccessFile(
file_src);
archive = new Archive(readOnlyAccessFile);
final List fileHeaders = archive.getFileHeaders();
int actualaSize = 0;
for (FileHeader fileHeader : fileHeaders){
//String fileNameString=fileHeader.getFileName();//这是英文情况
//如果是象日文和中文那样的双字节字.get filenamebyte and remove error code
byte[] filebytes=fileHeader.getFileNameByteArray();
int endflg=0;
for(int i=0;i
if(filebytes[i]==0){
break;
}
}
//get filename
String fileNameString=new String(filebytes,0,endflg,"SJIS"); //这是日语编码.如果是中文系统就换成相应的编码.
if(os!=null && !os.startsWith("windows")){//linux,repalce "\" to "/"
fileNameString=fileNameString.replace("\\", System.getProperty("file.separator", null));
}
File unpackedFile = new File(extractToFolder, fileNameString);
File parentFolder = unpackedFile.getParentFile();
//create the parents tree
parentFolder.mkdirs();
if(Integer.toHexString(fileHeader.getUnpMethod()).equals("30")
& (Integer.toHexString(fileHeader.getUnpVersion()).equals("14"))){
actualaSize++;
}else{
FileOutputStream out=null;
try {
out = new FileOutputStream(unpackedFile);
archive.extractFile(fileHeader,out );
actualaSize++;
} catch (FileNotFoundException e) {
unpackedFile.delete();
parentFolder.delete();
}finally{
out.close();
}
}
}
} catch (Exception e) {
extractToFolder.delete();
return false;
}finally{
try {
readOnlyAccessFile.close();
} catch (Exception e1) {
;
}
}
return true;
}