首页 > 其他分享 >如何处理压缩文件de方式总结!!!

如何处理压缩文件de方式总结!!!

时间:2024-07-11 18:55:15浏览次数:16  
标签:总结 文件 读取 de 压缩文件 rootDir File 根目录 new

目录

1.Java 标准库中的压缩相关API

2.解压缩过程

3.第三方库

4.使用第三方库的步骤

5.参考代码


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)打开压缩文件:使用ZipInputStreamGZIPInputStream打开压缩文件。

  (2)读取条目:对于ZIP文件,使用getNextEntry()方法循环读取每个条目;对于GZIP文件,只有一个条目。

  (3)处理条目:检查条目是否为文件或目录,如果是文件,则读取并写入到目标位置;如果是目录,则创建目录结构。

  (4)关闭资源:完成读取后,关闭所有打开的流和文件。

3.第三方库

对于非ZIP和GZIP格式的压缩文件,如TAR、RAR和7Z,Java标准库不提供直接支持,因此需要使用第三方库。

  (1)Apache Commons Compress:这个库支持多种压缩格式,包括TAR、BZIP2、XZ等。它提供了类似TarArchiveInputStreamTarArchiveOutputStream的类来处理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();
	}
}
  • unrar 方法与unzip 类似,但使用了针对RAR格式的库。
  • 创建源RAR文件对象和解压后的根目录对象。
  • 如果根目录已存在,删除它。
  • 创建根目录。
  • 使用Archive 类从RAR源文件中读取。
  • 获取所有FileHeader 对象列表,并按名称排序。
  • 循环处理每个FileHeader,创建子文件或目录。
  • 使用FileUtils.copyInputStreamToFile 方法复制文件数据。

标签:总结,文件,读取,de,压缩文件,rootDir,File,根目录,new
From: https://blog.csdn.net/qq_67028830/article/details/140359408

相关文章

  • T5架构和主流llama3架构有什么区别和优缺点、transformer中encoder 和decoder的不同、
    T5架构和主流llama3架构有什么区别和优缺点T5和LLaMA是两种在自然语言处理(NLP)领域广泛应用的大型语言模型,它们在架构和应用上有显著的区别和各自的优缺点。T5架构架构特点:Encoder-Decoder结构:T5(Text-to-TextTransferTransformer)采用了经典的Encoder-DecoderTransform......
  • JavaScript 进阶(五)---forEach/map/filterevery/some/includes/reduce的详细用法
    目录1.forEach2.map3.filter4.for...in5.for...of6.every7.some8.includes9.reduce举个例子:使用fliter:使用 map 来筛选并转换数组使用 forEach 来筛选并构建数组总结1.forEach-详解:`forEach`方法对数组的每个元素执行一次提供的函数。这个方......
  • 【python生成用例报告】unittest、HTMLTestReport、参数化demo
    使用第三方的报告模版,生成报告HTMLTestReport,本质是TestRunner-安装pipinstallHTMLTestReport-使用1.导包unittest、HTMLTestReport2.组装用例(套件,loader)3.使用HTMLTestReport中的runner执行套件4.查看报告目录结构:app.py:importosBase......
  • 代码随想录算法训练营第六天 | Python | LeetCode242.有效的字母异位词、LeetCode349.
    哈希表理论https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html一般哈希表都是用来快速判断一个元素是否出现集合里。数组/set/mapLeetCode242.有效的字母异位词题目链接:https://leetcode.cn/problems/valid-anagr......
  • 代码随想录算法训练营第四天 | Python | LeetCode24.两两交换链表中的节点、19.删除链
    LeetCode24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/文章/视频链接:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E7%AE%9......
  • windows安装Docker Desktop及国内镜像
    简介Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。通过Docker工具,简化了应用的部署、配置和管理过程,提高了开发效率和应用的可靠性、可移植性和可扩展性。DockerDeskto......
  • Delphi FMX跨平台框架
     一、前言    传统老Delphi人员大部分基本都是C/S端(客户端)开发上手(基于Windows开发),而FMX是Delphi中用于创建跨平台图形用户界面的框架。它允许开发人员使用单个代码库创建适用于多个操作系统的应用程序,如Windows、macOS、iOS和Android。FMX提供了丰富的界面控件和视......
  • 总结24个Python接单赚钱平台与详细教程,兼职月入5000+
     如果说当下什么编程语言最靠谱或者比较适合搞副业?答案肯定100%是:Python。python是所有语法中最简单易上手的语言,不需要特别的的英语词汇量,逻辑思维也不需要很差就能上手。而且学会了之后就能编写代码爬取各种数据,制作各种图表,提升工作效率。而且还能利用业余时间接点私活......
  • 织梦dedecms网站数据库无法连接
    当DedeCMS(织梦内容管理系统)无法连接数据库时,可能由多种原因引起。以下是一些常见的解决步骤和检查点,帮助你诊断并解决问题:1.检查数据库配置信息首先,确保DedeCMS的数据库配置文件(通常是config/database.php或include/config_database.php,具体取决于DedeCMS的版本和安装设置)中的......
  • K8S各组件概念以及原理知识总结
    简述ETCD及其特点? etcd是CoreOS团队发起的开源项目,是一个管理配置信息和服务发现(servicediscovery)的项目,它的目标是构建一个高可用的分布式键值(key-value)数据库,基于Go语言实现。特点:简单:支持REST风格的HTTP+JSONAPI安全:支持HTTPS方式的访问快速:支持并......