前言
日常使用中有解压软件可以解压压缩包,但是生产中一般都是代码完成。
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 有版权,有些东西没有公开,对解压有一些限制,即使其他解压包也可能有问题,但是建议尝试。