我们常用的压缩文件有两种:后缀为.zip或者.rar,接下来将介绍解析两种压缩文件的代码。需要用到三个jar包:commons-io-2.16.1.jar、junrar-7.5.5.jar、slf4j-api-2.0.13.jar,可以在官网下载,也可以发私信。
这段代码是一个Java程序,包含了一个
main
方法和一个
unzip
方法。在
main
方法中,通过传入一个文件路径(
path
),判断该文件是以
.zip
结尾还是其他类型的文件,并根据不同的情况调用
unzip
方法或
unrar
方法进行解压缩。
1、后缀为.zip的压缩文件
unzip
方法主要实现了解压缩
zip
格式文件的功能。它首先根据传入的文件路径创建一个
File
对象,然后根据该文件对象获取根目录的路径,并判断根目录是否已经存在,如果存在则删除该目录(使用
FileUtils
工具类删除)。接着创建根目录,并使用
ZipInputStream
来读取压缩文件中的内容,遍历每个子目录或子文件(
ZipEntry
对象),然后根据每个子目录或子文件创建相应的
File
对象,并在物理磁盘上创建子目录或文件,最后将压缩文件中的内容写入到新创建的子文件中。
需要注意的是,该代码使用了
FileUtils
和
ZipInputStream
来处理文件和解压缩操作,同时捕获了可能抛出的
IOException
异常并进行了处理。
public class Demo {
public static void main(String[] args) {
String path="D:\\Ayjy\\001\\easyftp-server-1.7.0.10-cn.zip";
if (path.endsWith(".zip")) {
unzip(path);
} else {
unrar(path);
}
}
//解压缩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(); //仅能删除空目录
//使用commons-io包提供的FileUtils工具进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建根目录
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();
//读取当前压缩包中的子文件,并通过输出流out写入新的子文件中
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) {
e.printStackTrace();
}
}
此处必须为-1
因为当文件读取完成时,会出现以下结果:
2、后缀为.rar的压缩文件
unrar()方法和unzip()方法一起写在Demo类中
unrar()方法实现了解压缩
rar
格式文件的功能。首先根据传入的文件路径创建一个
File
对象表示待解压缩的
rar
文件,并通过该文件对象获取根目录的路径。如果根目录已经存在,则使用
FileUtils
工具类删除该目录;接着创建新的根目录。
然后通过创建
Archive
对象,使用
FileInputStream
读取
rar
压缩文件格式。通过
getFileHeaders()
方法获取压缩文件中的所有子目录或子文件(
FileHeader
对象),并将其按照名称排序。接着遍历子目录和子文件,创建新的子目录或文件,并将压缩文件中的内容写入新创建的子文件中。
在处理异常时,捕获了可能抛出的
FileNotFoundException
、
RarException
和
IOException
异常,并进行相应的处理。这段代码主要使用了
Archive
类来读取
rar
文件内容,以及
FileUtils
类来处理文件操作。
//解压缩rar格式
public static void unrar(String path) {
//1.创建解压缩的根目录
File rarFile = new File(path);
File rootDir=new File(rarFile.getParent()+"\\"+rarFile.getName().substring(0,rarFile.getName().indexOf(".")));
if(rootDir.exists()){
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
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) {
e.printStackTrace();
} catch (RarException | IOException e) {
e.printStackTrace();
}
}

发布评论