2021SC@SDUSC
目录
一、线程池的使用
由于本人负责的压缩文件处理第一个就涉及到Java线程池的问题,因此本次报告先围绕Java线程池即多线程问题展开。
之前大一学习java学到过多线程,而线程池是解决多线程的一个手段。
那么,什么是线程池?
在一个线程的生命周期内,往往线程创建和销毁的时间要大于线程执行的时间,所以频繁的创建线程会消耗额外的时间。如果等到有任务来了,在去创建线程的话效率就会比较低,如不把线程放在某个地方,任务来了,直接把线程拿过来用比较好;另外,线程池可以管理控制线程,使用线程池,可以进行统一分配,方便调优和监控。线程可以提供队列,存放缓冲等待执行的任务。
由此看来,线程池可以
- 降低资源消耗
- 提高响应速度
- 提高线程的可管理性
关于ExecutorService
ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent
包中。
主要方法如下:
Java给我们提供了一个Executors工厂类
,它可以帮助我们很方便的创建各种类型ExecutorService线程池
ExecutorService的创建
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。下面代码中线程的最大并发数取决于可用处理器的Java虚拟机的数量
java.lang.Runtime.availableProcessors() 方法: 返回可用处理器的Java虚拟机的数量。
这个值可以在虚拟机中的某个调用过程中改变。应用程序是可用的处理器数量敏感,因此应该偶尔查询该属性,并适当调整自己的资源使用情况。
private final ExecutorService executors = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
新线程的加入
Executor提供的submit(new Runnable)这个方法接收一个Runnable实例,并且异步的执行,下述代码端括号内的类继承自Runnable。
- 加入处理zip文件解压缩线程
executors.submit(new ZipExtractorWorker(entriesToBeExtracted, zipFile, filePath));
- 加入处理rar文件解压缩线程
executors.submit(new RarExtractorWorker(headersToBeExtracted, archive, filePath));
- 加入处理7Z文件解压缩线程
executors.submit(new SevenZExtractorWorker(entriesToBeExtracted, filePath));
二、7Z,rar,zip压缩文件的区别
首先介绍一下压缩文件的大致流程
说到压缩文件, 一般会遇到两个概念, 一个是 "Compress"(压缩) 和"Archive" (存档). "存档" 这个词个人觉得不好理解. 我个人把 "Archive" 叫做 "打包".
举个例子, 比如有一堆毛巾, 每一条毛巾代表一个文件. "Compress"(压缩)的意思就是把毛巾里面的水拧干, 达到压缩的目的. 而"Archive"(打包) 的意思就是把这些毛巾包成一个大包, 便于运输. 所以你可能想到了, 要运输一堆这样的毛巾可能有两种方法: 第一种: 先把每条毛巾拧干并折成方块(压缩), 再把这些方块组合成一个大包(打包). 第二种, 先把这些毛巾包成一个大包(打包), 然后再把这个大包拧干. 凭经验你可能已经意识到, 前一种方法比较好处理, 而且压缩比比较大. 后一种方法就弱一点了.
前一种就是先压缩后打包的方式. 7z, zip 和rar等就是用的这种方法. 后一种就是先打包, 后压缩的方法. 常见的tar.gz的文件就是用这种方法的. 先用tar打包, 在用gz压缩.
7z压缩率最高,RAR安全性高,ZIP使用范围广
1.zip文件格式
通常情况下,我们用到的ZIP文件格式:
[local file header + file data + data descriptor]{1,n} + central directory + end of central directory record
即
[文件头+文件数据+数据描述符]{此处可重复n次}+核心目录+目录结束标识当压缩包中有多个文件时,就会有多个[文件头+文件数据+数据描述符]
### local file header 文件头
用于标识该文件的开始,记录了该压缩文件的信息。
file data 文件数据
记录了相应压缩文件的数据
data descriptor 数据描述符
用于标识该文件压缩结束,该结构只有在相应的local file header中通用标记字段的第3bit设为1时才会出现,紧接在压缩文件源数据后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。
Central directory 核心目录
记录了压缩文件的目录信息,在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据。
2. 7Z文件格式
7z的文件结构基本上分为三部分:
1. 前文件头(就是最前面的header).
是32个字节定长的. 前文件头其实记录的信息很少, 它的主要目的是记录尾文件头的位置, 压缩的主要结构都是存在尾文件头中.
2. 压缩数据.
文件压缩后的压缩数据存放地点.
3. 尾文件头(就是放在文件末尾的header).
每个Folder 包含了哪些文件, 每个文件大小等等这些详细信息都存贮在7z的尾文件头
3.Rar文件格式
RAR文件通常由以下数据块组成:
1 | 标记块:HEAD_TYPE=0x72 |