科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用GZIP和Zip压缩Java数据流

使用GZIP和Zip压缩Java数据流

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在这篇文章中,我将简要介绍在Java中通过GZIP和Zip进行数据压缩的方法。

作者:builder.com.cn 2007年4月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

GZIP编码

GZIP是最简单的压缩方法,对于只有一个数据流的情况是最适宜使用的,在列表A中,我演示了压缩和解压缩文件的例子。

import java.io.*;

import java.util.zip.*;

public class GZIP {

public void compress() throws IOException {

// first compress inputfile.txt into out.gz

BufferedReader in = new BufferedReader(

new FileReader("inputfile.txt"));

BufferedOutputStream out = new BufferedOutputStream(

new GZIPOutputStream(new FileOutputStream("out.gz")));

int c;

while ((c = in.read()) != -1) out.write©;

in.close();

out.close();

// now decompress our new file

BufferedReader in2 = new BufferedReader( new InputStreamReader(

New GZIPInputStream(new FileInputStream("out.gz")));

String s;

while ((s = in2.readLine()) != null)

System.out.println(s);

}

}

列表A

为了实现数据压缩,您需要通过输入输出类库构造函数的转换来实现您所需要的输出数据流。在列表A中,我通过Reader类来处理字节与符号的混合数据流,而GZIPOutputStream的构造函数只使用了基于OutputStream的数据流,这就是为什么当您打开一个文件的时候,压缩数据流GZIPInputStream被转换为符号数据流Reader的原因。

Zip压缩

相对于GZIP而言,Java的数据压缩类库提供了更丰富的功能来处理Zip格式的数据,压缩任何数量的文件都很容易,而且还有一个专门的类用于读取Zip文件。Java使用的是标准的Zip格式,因此任何压缩软件都可以读取您压缩的数据,列表B和列表A中的代码的结构相同,但是文件数量是没有限制的。

import java.io.*;

import java,util.*;

import java.util.zip.*;

public class Zip {

public void compress() throws IOException {

FileOutputStream f = new FileOutputStream("out.zip");

CheckedOutputStreamcsum = new CheckedOutputStream(

f, new CRC32());

ZipOutputStream out = new ZipOutputStream(

new BufferedOututStream(csum));

out.setComment("Here is how we compressed in Java");

// now adding files – any number with putNextEntry() method

BufferedReader in = new BufferedReader( new FileReader("1.txt"));

out.putNextEntry(new ZipEntry("1.txt"));

int c;

while ((c = in.read()) != -1) out.write©;

in.close();

// printing a checksum calculated with CRC32

System.out.println("Checksum: "+csum.getChecksum().getValue());

// Now decompress archive

FileInputStreamfi = new FileInputStream("out.zip");

CheckedInputStreamcsumi = new CheckedInputStream(fi,new CRC32());

ZipInputStream in2 = new ZipInputStream(

new BufferedInputStream(csumi));

ZipEntryze;

while ((ze = in2.getNextEntry()) != null) {

System.out.println("Extracting file "+ze);

int x;

while ((x = in2.read()) != -1)

System.out.write(x);

System.out.println();

}

System.out.println("Checksum extracted: "+

csumi.getChecksum().getValue());

in2.close();

}

}

列表B

注意CheckedOutputStreamCRC32类的使用,通过这两个类,您可以对数据完整性进行校验,校验位可以用来检查数据是否发生了改变,而CRC32则是一个非常知名的32位算法,可以用来检查数据完整性。

对每一个添加到压缩包中的文件,您必须调用putNextEntry()方法和相应的ZipEntry对象,ZipEntry对象包含了所有的额外信息,比如文件名、压缩前和压缩后的文件大小、CRC校验位、注释和压缩方法等,但是Java的数据压缩类库并不支持对Zip文件添加密码。

采用方法

您可以使用以上的方法来压缩和解压缩任何数据流,数据压缩的应用非常广泛,例如,在很多servlet软件和servlet服务器上的servlet输出流都使用了数据压缩,而且经过GZIP压缩的数据也是在互联网络上使用HTTP协议传输数据的标准格式。

责任编辑:德东

查看本文国际来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章