java解析压缩文件,压缩文件中有zip格式和rar格式,格式不相同对应的方法就不同
首先进行解压缩时,我们需要用到第三方库,分别是 slf4j-api-2.0.13.jar和junrar-7.5.5.jar
然后我们先定义两个方法,用来分别解压缩zip格式和rar格式:
public static void unzip(String path){}
public static void unrar(String path){}
使用main方法来判断如果后缀为zip则调用unzip方法,如果后缀为rar则调用unrar方法:
public static void main(String[] args) {
String path="D:\\猿究院\\zip_rar案例\\实验案例.rar";
//String path="D:\\猿究院\\zip_rar案例\\easyftp-server-1.7.0.10-cn.zip";
if(path.endsWith(".zip")) {
unzip(path);
} else if (path.endsWith(".rar")) {
unrar(path);
}
}
zip格式的文件
解压缩zip或rar需要用到I/O流,文件操作以及第三方库的使用,对于zip格式的文件java标准库提供了 java.util.zip 包,其中用到ZipInputStream 和ZipOutputStream流来进行读取和写入zip文件
步骤:
1、先跟据原始路径创建源文件(file对象)
2、通过源文件创建得到新的“.zip”文件的根目录
3、判断此根目录若存在,则调用common-io包提供的FileUtil工具类进行删除,然后创建新的根目录
4、使用ZipInputStream用于进行zip格式的压缩文件输入流
5、循环遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)并判断其若不为空,则创建子目录或子文件(File对象)
6、再判断遍历得到的zipEntry对象若是子目录则创建新子目录(file.mkdir()),若是文件创建新子文件(file.createNewFile())
7、读取当前压缩包中的子文件,并通过输出流写入到新子文件中
//解压缩zip格式
public static void unzip(String path){
//根据原始路径(字符串),创建源文件(File对象)
File sourceFile=new File(path);
//根目录
String sourceFileName=sourceFile.getName();
File rootDir=new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
if(rootDir.exists()){
//如果存在,则删除
//rootDir.delete();//仅能删除空目录
//使用common-io包提供的FileUtils工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//创建根目录
rootDir.mkdir();
//ZipInputStream:用于进行zip格式的压缩文件输入流
try(ZipInputStream in=new ZipInputStream(new FileInputStream(sourceFile))){
//遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)
ZipEntry zipEntry=null;
while((zipEntry=in.getNextEntry())!=null){
//创建子目录或子文件(File对象)
File file=new File(rootDir.getPath()+"\\"+zipEntry.getName());
if(zipEntry.isDirectory()){
//物理磁盘创建新子目录
file.mkdir();
}else{
//物理磁盘创建新子文件
file.createNewFile();
//读取当前压缩包中的子文件,并通过输出流写入到新子文件中
try(FileOutputStream out=new FileOutputStream(file)){
byte[] buff=new byte[1024];
int len=-1;
while((len=in.read(buff))!=-1){
out.write(buff,0,len);
}
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
rar格式的文件
步骤:
1、先跟据原始路径创建源文件(file对象)
2、通过源文件创建得到新的“.zip”文件的根目录
3、判断此根目录若存在,则调用common-io包提供的FileUtil工具类进行删除,然后创建新的根目录
4、创建Archive对象,用于读取rar压缩文件格式
5、获取压缩文件中的所有子目录或子文件(FileHeader对象)
6、按照子目录(子文件)名称排序
7、再判断遍历得到的FileHeader对象若是子目录则创建新子目录(file.mkdir()),若是文件创建新子文件(file.createNewFile())
8、获取压缩包中的子文件输入流,并复制文件输入流至新子文件
//解压缩rar格式
public static void unrar(String path){
//创建解压缩根目录
File rarFile=new File(path);
File rootDir=new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
if(rootDir.exists()){
try{
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
rootDir.mkdir();
//创建Archive对象,用于读取rar压缩文件格式
try(Archive archive=new Archive(new FileInputStream(path))){
//获取压缩文件中的所有子目录或子文件(FileHeader对象)
List<FileHeader> fileHeaderList = archive.getFileHeaders();
//按照子目录(子文件)名称排序
fileHeaderList.sort(new Comparator<FileHeader>(){
@Override
public int compare(FileHeader o1, FileHeader o2) {
return o1.getFileName().compareTo(o2.getFileName());
}
});
//遍历子目录和子文件
for(FileHeader fd:fileHeaderList){
File f=new File(rootDir.getPath()+"\\"+fd.getFileName());
if(fd.isDirectory()){
//创建新子目录
f.mkdir();
}else {
//创建新子文件
f.createNewFile();
//获取压缩包中的子文件
InputStream in=archive.getInputStream(fd);
FileUtils.copyInputStreamToFile(in,f);
}
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (RarException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}