扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者: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
注意CheckedOutputStream和CRC32类的使用,通过这两个类,您可以对数据完整性进行校验,校验位可以用来检查数据是否发生了改变,而CRC32则是一个非常知名的32位算法,可以用来检查数据完整性。
对每一个添加到压缩包中的文件,您必须调用putNextEntry()方法和相应的ZipEntry对象,ZipEntry对象包含了所有的额外信息,比如文件名、压缩前和压缩后的文件大小、CRC校验位、注释和压缩方法等,但是Java的数据压缩类库并不支持对Zip文件添加密码。
采用方法
您可以使用以上的方法来压缩和解压缩任何数据流,数据压缩的应用非常广泛,例如,在很多servlet软件和servlet服务器上的servlet输出流都使用了数据压缩,而且经过GZIP压缩的数据也是在互联网络上使用HTTP协议传输数据的标准格式。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者