目录
1.Java 标准库中的压缩相关API
Java的标准库java.util.zip
提供了处理ZIP和GZIP格式压缩文件的功能。这个包包含以下主要类:
(1)ZipFile
: 用于读取ZIP文件的元数据,如文件列表和注释。
(2)ZipInputStream
: 用于读取ZIP格式的输入流,可以从中读取多个条目(文件或目录)。
(3)ZipEntry
: 表示ZIP文件中的一个条目,可以是文件也可以是目录。
(4)ZipOutputStream
: 用于创建ZIP格式的输出流,可以向其中写入多个条目。
(5)GZIPInputStream
: 用于读取GZIP压缩的数据流。
(6)GZIPOutputStream
: 用于写入GZIP格式的压缩数据流。
2.解压缩过程
解压缩(也称为提取)一个压缩文件通常涉及以下步骤:
(1)打开压缩文件:使用ZipInputStream
或GZIPInputStream
打开压缩文件。
(2)读取条目:对于ZIP文件,使用getNextEntry()
方法循环读取每个条目;对于GZIP文件,只有一个条目。
(3)处理条目:检查条目是否为文件或目录,如果是文件,则读取并写入到目标位置;如果是目录,则创建目录结构。
(4)关闭资源:完成读取后,关闭所有打开的流和文件。
3.第三方库
对于非ZIP和GZIP格式的压缩文件,如TAR、RAR和7Z,Java标准库不提供直接支持,因此需要使用第三方库。
(1)Apache Commons Compress:这个库支持多种压缩格式,包括TAR、BZIP2、XZ等。它提供了类似TarArchiveInputStream
和TarArchiveOutputStream
的类来处理TAR文件,以及其他压缩格式的对应类。
(2)UnRAR:专门用于处理RAR格式的文件。这个库通常需要与原生代码一起工作,因此在不同平台上可能需要不同的原生库。
(3)7-Zip-JBinding:这是一个Java绑定库,用于处理7-Zip格式的文件。它提供了与7-Zip命令行工具相似的功能。
4.使用第三方库的步骤
1.添加依赖:在构建系统(如Maven或Gradle)中添加第三方库的依赖。
2.调用API:使用库提供的API来读取和写入压缩文件。
5.参考代码
public static void main(String[] args) {
String path = "D:\\项目\\实验案例.rar";
if (path.endsWith(".zip")) {
unzip(path);
} else if (path.endsWith(".rar")) {
unrar(path);
}
}
main
方法作为程序入口,指定文件路径,并判断文件扩展名,调用对应的解压方法。
public static void unzip(String path) {
// 根据原始路径创建源文件
File f = new File(path);
// 根目录
String fileName = f.getName();
File rootDir = new File(f.getParent() + "\\" + fileName.substring(0, fileName.lastIndexOf(".")));
// 判断根目录是否已经存在
if (rootDir.exists()) {
// 如果存在就删除改文件目录,使用commons-io-2.16.1.jar工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
// 创建根目录
rootDir.mkdir();
// 用于zip文件格式输入流
try (ZipInputStream in = new ZipInputStream(new FileInputStream(f))) {
// 遍历每一个子文件子目录
ZipEntry zipEntry = null;
while ((zipEntry = in.getNextEntry()) != null) {
// 创建子文件和子目录对象
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 (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
unzip
方法接收文件路径,创建源文件对象。- 获取文件名和创建解压后的根目录对象。
- 如果根目录已存在,使用
FileUtils.deleteDirectory
方法删除它。- 创建根目录。
- 使用
ZipInputStream
从源文件中读取。- 循环读取每个
ZipEntry
,创建子文件或目录。- 对于文件,使用
FileOutputStream
写入解压后的数据。
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()) {
// 如果存在就删除改文件目录,使用commons-io-2.16.1.jar工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
// 创建根目录
rootDir.mkdir();
// 创建Archive对象,用于读取rar压缩文件格式
try (Archive archive = new Archive(new FileInputStream(path))) {
// 获取压缩文件中所有文件的子文件子目录
List<FileHeader> fileheaderlist = archive.getFileHeaders();
// 按照子文件子目录进行排序
fileheaderlist.sort(new Comparator<FileHeader>() {
public int compare(FileHeader o1, FileHeader o2) {
return o1.getFileName().compareTo(o2.getFileName());
}
});
for (FileHeader ff : fileheaderlist) {
// System.out.println(ff.getFileName());
File f = new File(rootDir.getPath() + "\\" + ff.getFileName());
if (ff.isDirectory()) {
f.mkdir();
} else {
// 创建子文件
f.createNewFile();
// 获取压缩包中的子文件输入流
InputStream in = archive.getInputStream(ff);
// 复制文件输入流至新文件
FileUtils.copyInputStreamToFile(in, f);
}
}
} catch (RarException | IOException e) {
e.printStackTrace();
}
}
标签:总结,文件,读取,de,压缩文件,rootDir,File,根目录,new From: https://blog.csdn.net/qq_67028830/article/details/140359408
unrar
方法与unzip
类似,但使用了针对RAR格式的库。- 创建源RAR文件对象和解压后的根目录对象。
- 如果根目录已存在,删除它。
- 创建根目录。
- 使用
Archive
类从RAR源文件中读取。- 获取所有
FileHeader
对象列表,并按名称排序。- 循环处理每个
FileHeader
,创建子文件或目录。- 使用
FileUtils.copyInputStreamToFile
方法复制文件数据。