首页 > 作文

手机怎么解压zip文件

更新时间:2023-03-08 19:47:48 阅读: 评论:0

农村挣钱项目-苹果备份在哪里

手机怎么解压zip文件
2023年3月8日发(作者:眼镜十大品牌)

java分卷压缩_ApacheCommonsCompress介绍-Zip压缩解压

Zip格式应该是最出名的压缩格式之⼀了,zlib、gzip这些辈分很⽼的库⼤家应该都⽤过,甚⾄⼤部分其他格式的压缩库,都可以处理zip格

式。CommonsCompress当然也少补了对zip格式的⽀持。下⾯⼤部分demo都可以在Compress的官⽹找到CommonsCompress

解压

Compress的zip⽀持两种类型的解压:顺序解压和随机访问解压,听起来有点像链表(顺序)和数组(随机)的区别,实际上也确实很类似。这

两种类型实际上是zip格式本⾝决定的,具体的原理我后⾯可以会详细解释⼀下,这⾥简单讲⼀下:zip格式的头信息,或者说解压元数据(⽐

如第1个⽂件从第100个字节处开始,压缩后长度m字节,解压后长度n字节;然后第2个⽂件从第400个字节处开始...),提前读取了这些头

信息,我们就可以指哪打哪,想解压什么就解压什么,这也就是随机访问解压的⽅式,即通过ZipFile来解压zip⽂件:

ZipFile随机访问:

根据名字解压特定⽂件,⽐如将/root/⽂件中,名称为targetFile的⽂件,解压为/tmp/output/targetFile⽂件,代码如下:

ZipFilezipFile=newZipFile("/root/");

ZipArchiveEntryentry=ry("targetFile");//我们可以根据名字,直接找到要解压的⽂件try(InputStreaminputStream

=utStream(entry)){

//这⾥inputStream就是⼀个正常的IO流,按照正常IO流的⽅式读取即可,这⾥简单给个例⼦byte[]buffer=newbyte[4096];

FileoutputFile=newFile("/tmp/output/targetFile");

try(FileOutputStreamfos=newFileOutputStream(outputFile)){

while((buffer)>0){

(buffer);

}

}catch(FileNotFoundExceptione){

tackTrace();

}catch(IOExceptione){

tackTrace();

}

}

解压全部⽂件,⽐如要将/root/中的全部⽂件,解压到/tmp/output⽬录下,代码如下:

ZipFilezipFile=newZipFile(newFile("/root/"));

byte[]buffer=newbyte[4096];

ZipArchiveEntryentry;

Enumerationentries=ries();//获取全部⽂件的迭代器InputStreaminputStream;

while(eElements()){

entry=ement();

if(ctory()){

continue;

}

FileoutputFile=newFile("/tmp/output/"+e());

if(!entFile().exists()){

entFile().mkdirs();

}

inputStream=utStream(entry);

try(FileOutputStreamfos=newFileOutputStream(outputFile)){

while((buffer)>0){

(buffer);

}

}catch(FileNotFoundExceptione){

tackTrace();

}catch(IOExceptione){

tackTrace();

}

}

另外,ZipFile的构造函数还⽀持通过File、SeekableByteChannel类型传递Zip⽂件,其中SeekableByteChannel可以解压已经读⼊内存

的Zip⽂件;还有其他⼀些不常⽤到的参数可以设置,具体可以参考ZipFile构造函数相关的注释说明。

ZipArchiveInputStream顺序访问:

除了随机解压,Compress还⽀持顺序解压。可能⼤家会有疑问,有随机解压就够了,为什么还需要顺序解压呢?这是因为Zip⽂件的头信

息,实际上是在Zip⽂件的最后的,需要先读取Zip的最后⼀部分信息,然后再往前跳转着读取,如果Zip⽂件本⾝就在硬盘或者内存中的

话,随机访问的效率还是很⾼的。

对于⼀些IO场景,⽐如⽹络IO之类,我们倒是可以把整个Zip⽂件读到内存中,然后再随机访问进⾏解压。不过如果遇到对⼀些⽐较⼤的

zip,或者内存敏感(⽐如⼿机),这样的成本可能就太⾼了。

ZipArchiveInputStream就是为这种场景所设计的:它可以⼀个⽂件⼀个⽂件的读取,你在使⽤时可以决定解压或是不解压遍历到的⽂

件,Demo代码如下:

Filefile=newFile("/root/xxxxx/");

//这⾥还是⽤⽂件流举例,实际可以是各种InputStreamtry(ZipArchiveInputStreamzipInputStream=new

ZipArchiveInputStream(newFileInputStream(file))){

ZipArchiveEntryentry=tZipEntry();

e();//这⾥同样可以获取包括名字在内的许多⽂件信息entry=tZipEntry();//如果我们不需要

读取第⼀个⽂件,可以直接跳到下⼀个⽂件byte[]buffer=newbyte[4096];

intread;

while((read=(buffer))>0){

XXXX

}

}

分卷⽂件解压:

Compress在1.20版本以后,已经可以⽀持Zip分卷⽂件解压了,使⽤⽅式也很简单,只需要在创建channel的时候,调⽤

ZipSplitReadOnlySeekableByteChannel进⾏创建,然后调⽤ZipFile或者ZipArchiveInputStream解压即可:

//可以通过最后⼀个分卷zip⽂件创建channel,注意需要保证所有分卷⽂件都在同⼀⽬录下,并且除后缀名之外⽂件名相同

FilelastSegmentFile=newFile("/root/");

SeekableByteChannelchannel=romLastSplitSegment(lastSegmentFile);

//也可以通过指定所有zip分卷⽂件创建channel

FilefirstSegmentFile=newFile("/root/test.z01");

FilecondSegmentFile=newFile("/root/test.z02");

FilethirdSegmentFile=newFile("/root/");

SeekableByteChannelchannel=es(firstSegmentFile,condSegmentFile,

thirdSegmentFile);

压缩

Compress当然也⽀持创建zip压缩⽂件,主要是通过ZipArchiveOutputStream实现,Demo代码如下:

Filearchive=newFile("/root/");

try(ZipArchiveOutputStreamoutputStream=newZipArchiveOutputStream(archive)){

ZipArchiveEntryentry=newZipArchiveEntry("testdata/");

//可以设置压缩等级el(5);

//可以设置压缩算法,当前⽀持ED和两种hod(ED);

//也可以为每个⽂件设置压缩算法hod(ED);

//在zip中创建⼀个⽂件hiveEntry(entry);

//并写⼊内容("abcdn".getBytes(e("UTF-8")));

//完成⼀个⽂件的写⼊rchiveEntry();

entry=newZipArchiveEntry("testdata/");

hod();

hiveEntry(entry);

("efghn".getBytes(e("UTF-8")));

rchiveEntry();

}

如果需要创建zip分卷⽂件,只需要在ZipArchiveOutputStream的构造函数中,传⼀个希望的分卷⽂件⼤⼩,其他代码完全相同,这⾥需

要简单注意⼀下,zip合法的分卷⼤⼩在64kb到4gb之间,超出此范围的值会报错:

//创建⼀个最⼤1MB的分卷zip⽂件ZipArchiveOutputStreamoutputStream=newZipArchiveOutputStream(archive,1024*

1024);

另外,Compress还⽀持并发创建zip⽂件,具体使⽤⽐较复杂,可以参考Compress官⽹中ParallelScatterZipCreator的例⼦,也可以参

考Compress代码中的测试⽤例。

总结

1、Compress的zip解压可以通过ZipFile和ZipArchiveInputStream实现,适⽤的场景为:

ZipFile:适⽤于zip⽂件在硬盘⾥或内存⾥的情况,可以随机访问

ZipArchiveInputStream:适⽤于通过⽹络IO或其他只能顺序读取zip的情况,只能顺序访问

2、压缩通过ZipArchiveOutputStream实现,可以传参以实现分卷压缩;

3、分卷解压通过ZipSplitReadOnlySeekableByteChannel实现;

本文发布于:2023-03-08 19:47:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678276068186813.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:手机怎么解压zip文件.doc

本文 PDF 下载地址:手机怎么解压zip文件.pdf

下一篇:返回列表
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26 专利检索|