Java解壓RAR5
阿新 • • 發佈:2021-07-15
Java 解壓RAR5
RAR5加密演算法並未公佈,所以很多開源工具包都只支援rar4,在解壓rar5格式時,會報出不支援rar5格式的錯誤,比如常用的junara
經過仔細的翻閱Google,找到了解決方案
1.新增pom檔案依賴
<dependency> <groupId>com.github.axet</groupId> <artifactId>java-unrar</artifactId> <version>1.7.0-8</version> </dependency> <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>
2.例子
package rar5; import java.io.IOException; import java.io.RandomAccessFile; import net.sf.sevenzipjbinding.IInArchive; import net.sf.sevenzipjbinding.SevenZip; import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream; public class RAR5Test { public static void main(String[] args) throws IOException { String rarDir = "D:\\rar5.rar"; String outDir = "D:\\rar5"; IInArchive archive; RandomAccessFile randomAccessFile; // 第一個引數是需要解壓的壓縮包路徑,第二個引數參考JdkAPI文件的RandomAccessFile //r代表以只讀的方式開啟文字,也就意味著不能用write來操作檔案 randomAccessFile = new RandomAccessFile(rarDir, "r"); archive = SevenZip.openInArchive(null, // null - autodetect new RandomAccessFileInStream(randomAccessFile)); int[] in = new int[archive.getNumberOfItems()]; for (int i = 0; i < in.length; i++) { in[i] = i; } archive.extract(in, false, new ExtractCallback(archive,unRarDir.getAbsolutePath() + "/")); archive.close(); randomAccessFile.close(); } }
3.編寫回調ExtractCallback
public class ExtractCallback implements IArchiveExtractCallback { private int index; private IInArchive inArchive; private String ourDir; public ExtractCallback(IInArchive inArchive, String ourDir) { this.inArchive = inArchive; this.ourDir = ourDir; } @Override public void setCompleted(long arg0) throws SevenZipException { } @Override public void setTotal(long arg0) throws SevenZipException { } @Override public ISequentialOutStream getStream(int index, ExtractAskMode extractAskMode) throws SevenZipException { this.index = index; final String path = (String) inArchive.getProperty(index, PropID.PATH); final boolean isFolder = (boolean) inArchive.getProperty(index, PropID.IS_FOLDER); return data -> { try { if (!isFolder) { File file = new File(ourDir + path); save2File(file, data); } } catch (Exception e) { e.printStackTrace(); } return data.length; }; } @Override public void prepareOperation(ExtractAskMode arg0) throws SevenZipException { } @Override public void setOperationResult(ExtractOperationResult extractOperationResult) throws SevenZipException { } public static boolean save2File(File file, byte[] msg) { OutputStream fos = null; try { File parent = file.getParentFile(); if ((!parent.exists()) && (!parent.mkdirs())) { return false; } fos = new FileOutputStream(file, true); fos.write(msg); fos.flush(); return true; } catch (FileNotFoundException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }