Java解压rar与zip

package org.jeecgframework.test.demo;


import org.jeecgframework.core.util.PasswordUtil;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;


import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;


public class Test {
/**

* @param rarFile
*            rar文件路径

* @param savePath
*            要解压的路径

*/
public static void Rar(String rarFile, String savePath) {


// 判断是否rar文件
if (!rarFile.endsWith(".rar")) {
System.err.println("打开的文件不是rar文件!");
return;
}
try {
FileOutputStream fos = null;
// 创建一个rar档案文件
Archive rarArchive = new Archive(new File(rarFile));
// 判断是否有加密
if (rarArchive != null) {
if (rarArchive.isEncrypted()) {
rarArchive.close();// 关闭资源
return;
}
FileHeader fileHeader = rarArchive.nextFileHeader();
while (fileHeader != null) {
if (!fileHeader.isDirectory()) {
// 从压缩文件中解压出来的文件名,有可能带目录的文件名
// String name = fileHeader.getFileNameString().trim();
String name = fileHeader.getFileNameW().isEmpty() ? fileHeader
.getFileNameString() : fileHeader.getFileNameW();
String outPutFileName = savePath + "\\" + name;
// 分离文件名,为了创建目录
File dir = new File(outPutFileName.substring(0, outPutFileName.lastIndexOf("\\")));
// 创建文件夹
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdirs();
}
fos = new FileOutputStream(new File(outPutFileName));
// 保存解压的文件
rarArchive.extractFile(fileHeader, fos);
// 关闭资源
fos.close();
fos = null;
}
fileHeader = rarArchive.nextFileHeader();
}
}
rarArchive.close();// 关闭资源
} catch (RarException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//Rar("E:\\b\\建设路街道数据.rar", "E:\\a");
//Zip("E:\\b\\jacob-1.17-M2 2.zip", "E:\\a");
Test.Zip("C:\\Users\\hyd\\Downloads\\a.zip", "D:\\test");
}

public static void Zip(String rarFile, String savePath) {
// String Inputpath = "E:\\b";//压缩包地址
// String outpath = "E:\\a";//解压到的文件地址
ZipEntry zipEntry = null;
try (
// ZipInputStream读取压缩文件 //压缩包名称
            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(rarFile),Charset.forName("GBK"));
            // 写入到缓冲流中
            BufferedInputStream bufferedInputStream = new BufferedInputStream(zipInputStream);
)
{
File fileOut = null;
// 读取压缩文件中的一个文件
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
// 若当前zipEntry是一个文件夹
if (zipEntry.isDirectory()) {
fileOut = new File(savePath + "\\" + zipEntry.getName());
// 在指定路径下创建文件夹
if (!fileOut.exists()) {
fileOut.mkdirs();
}
// 若是文件
} else {
// 原文件名与指定路径创建File对象(解压后文件的对象)
fileOut = new File(savePath, zipEntry.getName());
try (FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);) {
// 将文件写入到指定file中
int b = 0;
while ((b = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(b);
}
} catch (Exception e) {
e.printStackTrace();
}
}


}
} catch (Exception e) {
e.printStackTrace();
}
}
}

猜你喜欢

转载自blog.csdn.net/qq_38500224/article/details/80706639
今日推荐