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 条评论) |