java gzip zip,Java IO系列(四):文件压缩GZIP、Zip详解

有必要多看几遍的

fff6c98081bf8904098fb5e1bd59ff4b.gif

关于字符和字节,例如文本文件,XML这些都是用字符流来读取和写入。而如RAR,EXE文件,图片等非文本,则用字节流来读取和写入。

压缩类

有关压缩的类如下:

DeflaterOutputStream:压缩类的基类

ZipOutputStream:将数据压缩成Zip格式

GZIPOutputStream:将数据压缩成GZIP格式

CheckedOutputStream:为OutputStream生成校检和

InflaterInputStream:解压缩类的基类

ZipInputStream:解压Zip格式数据

GZIPInputStream:解压GZIP格式数据

CheckedInputStream:为InputStream生成校检和

对单个文件压缩——GZIPOutputStream和GZIPInputStream

当我们需要对单个数据流进行压缩,使用GZIP比较合适。

public class TestZipIn {

public static void main(String[] args) throws IOException {

/*

* 压缩数据

*/

BufferedReader reader = new BufferedReader(new FileReader("E:\\test\\hello.txt"));

BufferedOutputStream out = new BufferedOutputStream(

new GZIPOutputStream(new FileOutputStream("E:\\test\\test.gz")));

int c;

while((c = reader.read()) != -1){

out.write(c);

}

reader.close();

out.close();

/*

* 读取压缩数据

*/

BufferedReader reader2 = new BufferedReader(

new InputStreamReader(new GZIPInputStream(new FileInputStream("E:\\test\\test.gz"))));

String s;

while((s = reader2.readLine()) != null){

System.out.println(s);

}

}

}

上面实现了了把hello.txt文件的数据复制到了压缩文件test.gz中,并对他所文件进行读取。

对单个文件压缩——ZipOutputStream和ZipInputStream

压缩

Zip格式文件可以与下载的压缩工具更好的使用,所以多数情况下还是使用Zip。

public class TestZIP {

public static void main(String[] args) throws IOException {

FileOutputStream fos = new FileOutputStream("E:\\test\\hello.zip");

CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32());

ZipOutputStream zos = new ZipOutputStream(cos);

BufferedOutputStream out = new BufferedOutputStream(zos);

zos.setComment("a test of zip");

String[] files = {"hello.txt", "new.txt", "old.txt"};

String path = "E:\\test\\";

for (String file : files) {

System.out.println("write file " + file);

BufferedReader in = new BufferedReader(new FileReader(path + file));

zos.putNextEntry(new ZipEntry(file));

int c;

while((c = in.read()) != -1){

out.write(c);

}

in.close();

out.flush();

}

out.close();

}

}

上面实现了三个文件hello.txt”, “new.txt”, “old.txt”压缩成一个hello.zip的文件。ZipEntry表示Zip文件中的一个入口,上面三个文件,在Zip中则对应三个入口。每写入一个文件,就要为该文件打开一个入口。

CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32())生成了校检码,其中有两种方式:Adler32(快一些)和CRC32(慢一些,但更安全)。

解压缩

public class TestZIP {

public static void main(String[] args) throws IOException {

FileInputStream fis = new FileInputStream("E:\\test\\hello.zip");

CheckedInputStream cis = new CheckedInputStream(fis, new Adler32());

ZipInputStream zis = new ZipInputStream(cis);

BufferedReader br = new BufferedReader(new InputStreamReader(zis));

ZipEntry ze;

while((ze = zis.getNextEntry()) != null){//循环读文件

System.out.println("reading " + ze);

String x;

while((x = br.readLine()) != null){

System.out.println(x);

}

}

System.out.println(cis.getChecksum().getValue());

br.close();

}

}

其中,cis.getChecksum().getValue()返回校检码。解压缩的方法和顺序,和压缩的方法顺序相反。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值