以下內(nèi)容來自《WinRAR.chm》"RAR5"
是 WinRAR 5.0 引入的最新版本的 RAR 格式惋砂。它包含很多重要的修改妒挎,如 AES-256 加密、更有效的恢復(fù)記錄西饵、更大的字典大小酝掩,較老的軟件,包括老版本的 WinRAR眷柔,不能解壓 RAR 5.0 壓縮文件期虾。所以如果你計(jì)劃把一個壓縮文件發(fā)送給其他人原朝,選擇 RAR5 需要考慮兼容性問題。
RAR5加密算法并未公布镶苞,所以很多開源工具包都只支持rar4喳坠,在解壓rar5格式時,會報出不支持rar5格式的錯誤茂蚓,比如常用的junara
PLAN A
經(jīng)過仔細(xì)的翻閱Google壕鹉,找到了這個: http://sevenzipjbind.sourceforge.net/
7-Zip-JBinding is a java wrapper for 7-Zip C++ library. It allows extraction of many archive formats using a very fast native library directly from java through JNI. Features:
簡而言之,7-Zip-JBinding 是一個c++版7-Zip的封裝聋涨,就和在你本地安裝了7-Zip是類似的效果晾浴,通過jni交互。
官網(wǎng)有更詳細(xì)的介紹牍白,和一些簡單的例子:
<dependency>
<groupId>net.sf.sevenzipjbinding</groupId>
<artifactId>sevenzipjbinding</artifactId>
<version>16.02-2.01</version>
</dependency>
<dependency>
<groupId>net.sf.sevenzipjbinding</groupId>
<artifactId>sevenzipjbinding-all-platforms</artifactId>
<version>16.02-2.01</version>
</dependency>
private int getNumberOfItemsInArchive(String archiveFile) throws Exception {
IInArchive archive;
RandomAccessFile randomAccessFile;
randomAccessFile = new RandomAccessFile(archiveFile, "r");
archive = SevenZip.openInArchive(ArchiveFormat.ZIP, // null - autodetect
new RandomAccessFileInStream(randomAccessFile));
int numberOfItems = archive.getNumberOfItems();
archive.close();
randomAccessFile.close();
return numberOfItems;
}
經(jīng)過實(shí)測脊凰,這種方式是可以實(shí)現(xiàn)解壓rar5的,但是還有一些問題茂腥,由于文件編碼問題狸涌,可能會出現(xiàn)解壓出的文件存在亂碼的情況。這種情況暫時不知道怎么處理最岗,API上沒有相關(guān)參數(shù)可以指定文件編碼
PLAN B
既然RAR5沒公布算法帕胆,那我們就自己破解,肝出來仑性!
......
開個玩笑
緊接著我換了一種思路惶楼,代碼不行,工具來湊诊杆,找到了這個: http://www.rarlab.com
Welcome to RARLAB, home of WinRAR and RAR archivers
這個描述就很舒服
支持windows歼捐、linux、mac(我在mac用的就是這個命令晨汹,當(dāng)時找了好幾個解壓rar的軟件都要付費(fèi)豹储,索性brew install rar)
我們可以在代碼里調(diào)用系統(tǒng)腳本,來達(dá)到解壓rar的目的
先來安裝一下
uname -a
# 根據(jù)系統(tǒng)位數(shù)選擇對應(yīng)的包
wget https://www.rarlab.com/rar/rarlinux-x64-6.0.2b1.tar.gz
# wget https://www.rarlab.com/rar/rarlinux-6.0.2b1.tar.gz
tar -zxvf rarlinux-x64-6.0.2b1.tar.gz
cd rar
make & make install
如果你沒有權(quán)限的話淘这,可以找運(yùn)維同學(xué)幫助
public class UnrarUtils {
private static final Logger LOG = LoggerFactory.getLogger(UnrarUtils.class);
private static final String UNRAR_CMD = "unrar x ";
/**
* 將1個RAR文件解壓
* rarFileName 需要解壓的RAR文件(必須包含路徑信息以及后綴)
* destDir 解壓后的文件放置目錄
*/
public static String unRARFile(String filepath) {
String name = filepath.substring(0, filepath.lastIndexOf('.'));
File targetDir = new File(name);
if (!targetDir.exists()) {
targetDir.mkdirs();
}
String cmd = UNRAR_CMD + filepath + " " + name;
try {
Runtime rt = Runtime.getRuntime();
Process process = rt.exec(cmd);
int retCode = process.waitFor();
if (retCode == 0) {
LOG.info("解壓完畢");
return name;
}
} catch (Exception e) {
LOG.warn("解壓rar文件失敗:{}", JSONObject.toJSONString(e));
}
return name;
}
}
注意:process.waitFor() 會阻塞主線程剥扣,同時新開一個子線程去執(zhí)行任務(wù),如果任務(wù)耗時的話铝穷, 可能會引起一些其他的問題钠怯。
當(dāng)然本例中,waitFor的作用是曙聂,等待解壓完畢晦炊,會去讀取目錄下的文件,如果不等它的話,就讀不到你想要的文件了断国。
以上就是本次全部內(nèi)容了贤姆,感謝閱讀。
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布稳衬!