我们常用的压缩文件有两种:后缀为.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();
}
}