赞
踩
之前工作中遇到一个需求:rar 文件的压缩与解压缩。但是因为需求变动,还没来得及写,最近得空调研一下,发现 rar 比 zip 处理麻烦很多,这里小小记录一下。
rar是个专有格式,rar许可证不允许软件开发工具如JDK集成它,如果要在Java中解压rar文件,只能利用第三方工具依赖,如 junrar。官方地址为:GitHub - junrar/junrar: Plain Java unrar library
但是经过调研,发现压缩文件为 rar 还是很困难,没找到便捷可用的方法,这里仅记录 rar 文件解压的坑
- <dependency>
- <groupId>com.github.junrar</groupId>
- <artifactId>junrar</artifactId>
- <version>7.5.5</version>
- </dependency>
- import com.github.junrar.Junrar;
- import com.github.junrar.exception.RarException;
-
- import java.io.File;
- import java.io.IOException;
-
- public class CompressTest {
-
- public static void main(String[] args) {
- rar();
- }
-
- private static void rar() {
- try {
- File rar = new File("D:/test/diff.rar");
- File destinationFolder = new File("D:/test/rar");
- Junrar.extract(rar, destinationFolder);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } catch (RarException e) {
- throw new RuntimeException(e);
- }
- }
-
- }

我使用 winrar 创建了一个压缩文件 diff.rar,然后运行代码,抛出以下错误:
- 17:16:52.273 [main] WARN com.github.junrar.Archive - Support for rar version 5 is not yet implemented!
- 17:16:52.276 [main] WARN com.github.junrar.Archive - exception in archive constructor maybe file is encrypted, corrupt or support not yet implemented
- com.github.junrar.exception.UnsupportedRarV5Exception: null
- at com.github.junrar.Archive.readHeaders(Archive.java:354)
- at com.github.junrar.Archive.setChannel(Archive.java:199)
- at com.github.junrar.Archive.setVolume(Archive.java:811)
- at com.github.junrar.Archive.<init>(Archive.java:149)
- at com.github.junrar.Archive.<init>(Archive.java:170)
- at com.github.junrar.Junrar.createArchiveOrThrowException(Junrar.java:121)
- at com.github.junrar.Junrar.extract(Junrar.java:40)
- at com.github.junrar.Junrar.extract(Junrar.java:32)
- at com.example.demo.test.CompressTest.rar(CompressTest.java:19)
- at com.example.demo.test.CompressTest.main(CompressTest.java:12)
- 17:16:52.276 [main] ERROR com.github.junrar.Junrar - Error while creating archive
- com.github.junrar.exception.UnsupportedRarV5Exception: null
- at com.github.junrar.Archive.readHeaders(Archive.java:354)
- at com.github.junrar.Archive.setChannel(Archive.java:199)
- at com.github.junrar.Archive.setVolume(Archive.java:811)
- at com.github.junrar.Archive.<init>(Archive.java:149)
- at com.github.junrar.Archive.<init>(Archive.java:170)
- at com.github.junrar.Junrar.createArchiveOrThrowException(Junrar.java:121)
- at com.github.junrar.Junrar.extract(Junrar.java:40)
- at com.github.junrar.Junrar.extract(Junrar.java:32)
- at com.example.demo.test.CompressTest.rar(CompressTest.java:19)
- at com.example.demo.test.CompressTest.main(CompressTest.java:12)
- Exception in thread "main" java.lang.RuntimeException: com.github.junrar.exception.UnsupportedRarV5Exception
- at com.example.demo.test.CompressTest.rar(CompressTest.java:23)
- at com.example.demo.test.CompressTest.main(CompressTest.java:12)
- Caused by: com.github.junrar.exception.UnsupportedRarV5Exception
- at com.github.junrar.Archive.readHeaders(Archive.java:354)
- at com.github.junrar.Archive.setChannel(Archive.java:199)
- at com.github.junrar.Archive.setVolume(Archive.java:811)
- at com.github.junrar.Archive.<init>(Archive.java:149)
- at com.github.junrar.Archive.<init>(Archive.java:170)
- at com.github.junrar.Junrar.createArchiveOrThrowException(Junrar.java:121)
- at com.github.junrar.Junrar.extract(Junrar.java:40)
- at com.github.junrar.Junrar.extract(Junrar.java:32)
- at com.example.demo.test.CompressTest.rar(CompressTest.java:19)
- ... 1 more
-
- Process finished with exit code 1

原因是 junrar 不支持 rar5,只要压缩时选择rar4就没问题
重新压缩文件为 rar4
运行代码,发现能正常解压文件了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。