kkFileView(二)————压缩文件处理(一)

2021SC@SDUSC

目录

一、线程池的使用

那么,什么是线程池?

 关于ExecutorService

二、7Z,rar,zip压缩文件的区别

1.zip文件格式

2. 7Z文件格式

3.Rar文件格式

一、线程池的使用

由于本人负责的压缩文件处理第一个就涉及到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使用范围广

详细介绍zip、rar、7z的不同以及优势

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
2
3
4
5
6
7
8
9
10

标记块:HEAD_TYPE=0x72
压缩文件头:HEAD_TYPE=0x73
文件头:HEAD_TYPE=0x74
旧风格的注释头:HEAD_TYPE=0x75
旧风格的用户身份信息:HEAD_TYPE=0x76
旧风格的子块:HEAD_TYPE=0x77
旧风格的恢复记录:HEAD_TYPE=0X78
旧风格的用户身份信息:HEAD_TYPE=0X79
子块:HEAD_TYPE=0x7A
最后的结束块:HEAD_TYPE=0x7B

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值