[java][io][ZIP]用ZIP保存多个文件

本文介绍Java中Zip格式的支持,包括如何使用ZipOutputStream压缩文件到一个Zip包,设置压缩方法及级别,以及如何读取Zip文件等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java对Zip格式类库支持得比较全面,得用它可以把多个文件压缩成一个压缩包。这个类库使用的是标准Zip格式,所以能与很多的压缩工具兼容。

ZipOutputStream类有设置压缩方法以及在压缩方式下使用的压缩级别,zipOutputStream.setMethod(int method)设置用于条目的默认压缩方法。只要没有为单个 ZIP 文件条目指定压缩方法,就使用ZipOutputStream所设置的压缩方法来存储,默认值为 ZipOutputStream.DEFLATED(表示进行压缩存储),还可以设置成STORED(表示仅打包归档存储)。ZipOutputStream在设置了压缩方法为DEFLATED后,我们还可以进一步使用setLevel(int level)方法来设置压缩级别,压缩级别值为0-9共10个级别(值越大,表示压缩越利害),默认为Deflater.DEFAULT_COMPRESSION=-1。当然我们也可以通过条目ZipEntry的setMethod方法为单个条件设置压缩方法。

类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被ZipFile[zipFile.getInputStream(ZipEntry entry)]和ZipInputStream使用来读取ZIP文件,ZipOutputStream来写入ZIP文件的。有以下这些有用的方法:getName()返回条目名称、isDirectory()如果为目录条目,则返回 true(目录条目定义为其名称以 '/' 结尾的条目)、setMethod(int method) 设置条目的压缩方法,可以为 ZipOutputStream.STORED 或 ZipOutputStream .DEFLATED。



import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.Enumeration;
import java.util.zip.Adler32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
*
* 用Zip保存多个文件.
*
*/
public class ZipCompress {

private static final String FILE = "d:\\test.zip";

public static void main(String[] args) throws Exception {
//建立一个文件输出流
FileOutputStream file = new FileOutputStream(FILE);
//建立一个CheckSum输出流,Adler32 CheckSum类型校验和
CheckedOutputStream csum = new CheckedOutputStream(file, new Adler32());
//zip输出流
ZipOutputStream zos = new ZipOutputStream(csum);
//使用缓冲输出流包装,提升性能
BufferedOutputStream out = new BufferedOutputStream(zos);
//注释
zos.setComment("A test of Java Zipping");
for(String s : args){
System.out.println("Writing file " + s);
//读文件
BufferedReader in = new BufferedReader(new FileReader(s));

zos.putNextEntry(new ZipEntry(s));
int c;
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.flush();
}
out.close();

System.out.println("Checksum: " + csum.getChecksum().getValue());
//解压缩
System.out.println("Reading file: ");
FileInputStream in = new FileInputStream(FILE);
CheckedInputStream csumi = new CheckedInputStream(in, new Adler32());
ZipInputStream zin = new ZipInputStream(csumi);
BufferedInputStream bis = new BufferedInputStream(zin);
ZipEntry ze;
while((ze = zin.getNextEntry()) != null){
System.out.println("Reading file " + ze);
int x;
while((x = bis.read()) != -1){
System.out.write(x);
}
}

if(args.length == 1){
System.out.println("Checksum: " + csumi.getChecksum().getValue());
}
bis.close();

ZipFile zf = new ZipFile(FILE);
@SuppressWarnings("rawtypes")
Enumeration e = zf.entries();
while(e.hasMoreElements()){
ZipEntry ze2 = (ZipEntry)e.nextElement();
System.out.println("File: " + ze2);
}
zf.close();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值