rar文件
前言
日常使用中有解压软件可以解压压缩包,但是生产中一般都是代码完成。
1.声明依赖(集成环境:IJ.IDEA)
<!-- 解压rar -->
<dependency>
<groupId>com.github.junrar</groupId>
<artifactId>junrar</artifactId>
<version>3.0.0</version>
</dependency>
<!-- 解压zip -->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.4</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2.直接贴代码,把两个解压程序写到一个类里面
import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import java.io.*;
import java.util.Enumeration;
public class unzipAnRar {
public static void unZip(File zipFile, String outDir) throws IOException {
File outFileDir = new File(outDir);
if (!outFileDir.exists()) {
boolean isMakDir = outFileDir.mkdirs();
if (isMakDir) {
System.out.println("创建压缩目录成功");
}
}
ZipFile zip = new ZipFile(zipFile);
for (Enumeration enumeration = zip.getEntries(); enumeration.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) enumeration.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
if (entry.isDirectory()) { //处理压缩文件包含文件夹的情况
File fileDir = new File(outDir + zipEntryName);
fileDir.mkdir();
continue;
}
File file = new File(outDir, zipEntryName);
file.createnewfile();
outputstream out = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len;
while ((len = in.read(buff)) > 0) {
out.write(buff, 0, len);
}
in.close();
out.close();
}
}
public static void unRar(File rarFile, String outDir) throws Exception {
File outFileDir = new File(outDir);
if (!outFileDir.exists()) {
boolean isMakDir = outFileDir.mkdirs();
if (isMakDir) {
System.out.println("创建压缩目录成功");
}
}
Archive archive = new Archive(new fileinputstream(rarFile));
FileHeader fileHeader = archive.nextFileHeader();
while (fileHeader != null) {
if (fileHeader.isDirectory()) {
fileHeader = archive.nextFileHeader();
continue;
}
File out = new File(outDir + fileHeader.getFileNameString());
if (!out.exists()) {
if (!out.getparentFile().exists()) {
out.getParentFile().mkdirs();
}
out.createNewFile();
}
FileOutputStream os = new FileOutputStream(out);
archive.extractFile(fileHeader, os);
os.close();
fileHeader = archive.nextFileHeader();
}
archive.close();
}
}
Notes:上面程序使用了两个工具包,其中解压 rar 文件的 junrar 可能会出现最新 winrar 软件的压缩包解压不了的情况,这种情况暂时没法处理,只能等待 junrar 更新。
3.测试代码
import org.junit.Test;
import java.io.File;
import java.io.IOException;
public class UnZipAnRarTest {
@Test
public void getUnZipAnnRarTest() {
String originDir = "D:\\JavaPro\\TestFile\\";
String zipPath = originDir + "test.zip";
File zipFile = new File(zipPath);
String rarPath = originDir + "new.rar";
File rarFile = new File(rarPath);
try {
UnZipAnRar.unZip(zipFile, "D:\\JavaPro\\TestFile\\Test\\");
} catch (IOException e) {
e.printstacktrace();
}
try {
UnZipAnRar.unRar(rarFile, "D:\\JavaPro\\TestFile\\测试\\");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.结果展示
其中一个压缩文件的内容:
解压以后:
5.结语
junrar 的包有缺陷
其一:如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码,但是不影响文件夹里面的文件;
其二:最新 WinRar 压缩产生的 .rar 文件可能会无法解压。
缺陷原因:rar 有版权,有些东西没有公开,对解压有一些限制,即使其他解压包也可能有问题,但是建议尝试。
相关阅读
今天使用scp命令准备向目标服务器传输文件,但是遇到Permission denied这个问题,意思就是拒绝访问 scp apache-tomcat-8.0.28.tar x
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是
3L, 5L, 8L三个水桶等分8L水 Java(递归, 穷举)
题目 有三个容积分别是8升、5升和3升的水桶,其中容积为8升的水桶中有8升水,其它两个水桶是空的。三个水桶都没有刻度,问如何在不借
文章目录引言怎么入门网络爬虫课程特色学完本课程能收获什么引言 互联网以及移动技术的飞速发展,使得全球数据量呈现前所未有的爆
Javascript:history.go()和history.back()的用法与区别
Javascript:history.go()和history.back()的用法与区别简单的说就是:go(-1):返回上一页,原页面表单中的内容会丢失;back():返回上一页