Java I/O全文摘要(十)过滤流,压缩流

本文主要介绍了Java I/O中的过滤流和压缩流。Java的java.util.zip包提供了Deflater和Inflater用于压缩和解压缩,支持zip、gzip等格式。Deflater和Inflater可以通过设置策略、压缩级别和字典进行高级操作。同时,DeflaterOutputStream和InflaterInputStream作为过滤流简化了压缩和解压缩的过程。ZipFile和ZipEntry则用于处理zip归档文件。压缩流的使用包括设置压缩级别、创建ZipOutputStream和ZipInputStream,并利用校验和确保文件完整。
摘要由CSDN通过智能技术生成
1  压缩流

java.util.zip 包,包含了6个流类和其他6个其他各式各样用于读写zip,gzip和其他解压缩格式。

Java使用这些类来读取写入JAR文档和显示PNG图片。

你可以将这些工具用于通用的压缩和解压缩过程。

由于有了这些类,压缩和解压缩变得很容易。



2 Inflaters and Deflaters (解压者和压缩者)

java.util.zip.Deflater 和 java.util.zip.Inflater 为其他类提供压缩和解压的能力。

它们是Java的压缩和解压的引擎

大部分都是CPU密集型计算,所以底层使用了C来写.



3 压缩数据

Deflater类包含了压缩块数据的方法。

你可以选择压缩格式,级别和策略。

Deflater9步完成压缩:
1. 构造Deflater对象。
2. 选择策略(可选)。
3. 设置压缩级别(可选)。
4. 重置字典(可选)。
5. 设置输入
6. 重复压缩数据,直到needsInput()返回true
7. 如果有更多的可用数据,返回第5步继续添加。
否则,进行第8步
8. 完成数据
9. 如果有更多的流需要压缩,重启压缩器。


通常,你无需直接使用这个类,而是使用诸如 DeflaterInputStream或  DeflaterOutputStream这样的压缩流。这个类提供了一些便利的方法。


4 构造解压对象 

三个构造函数:

public Deflater(int level, boolean useGzip)
public Deflater(int level)
public Deflater( )


level越大,通常压缩时间越长,压缩得到的包越小

例如:

public static final int NO_COMPRESSION = 0;
public static final int BEST_SPEED = 1;
public static final int BEST_COMPRESSION = 9;
public static final int DEFAULT_COMPRESSION = -1;

如果useGzip为true,则使用gzip;否则,使用zlib格式。


5 策略选择

Java支持的压缩策略包括:filtered, Huffman, and default

public void setStrategy(int strategy)

支持:

Deflater.FILTERED = 1;
Deflater.HUFFMAN_ONLY = 2;
Deflater.DEFAULT_STRATEGY = -1;


如果出现不支持的策略,抛出 IllegalArgumentException

默认策略总是重复的词

哈弗曼编码:各个词频不一样

过滤器:可以妥协的2进制数据(例如音频视频之类)


6 设置压缩级别

除了在构造函数中进行级别的指定,你还可以通过如下方法:

public void setLevel(int Level)
来实现对压缩级别的指定。

总的而言,压缩速度和压缩质量总是负相关的

好的编码方式是使用下面几个常量中的一个:

Deflater.NO_COMPRESSION (0), 
Deflater.BEST_SPEED (1), 
Deflater.BEST_COMPRESSION (9), 
Deflater.DEFAULT_COMPRESSION (-1)
而不是一个显式的值。

在小文件上做的测试,发现0~9直接差别不大。

对于GIF, JPEG, or PNG这类图片文件,他们具有内置的压缩方式,所以通用的压缩反而可能增加他们的体积。


7 设置压缩字典

默认的压缩字典是根据顺序来进行的,它将最先读到的内容放置到字典中。第二次读到这个词时,将它用对应字典的位置来替换。

你可以为你的压缩文件预设这样的文本值

额外值得说明的是:由于文件直接差别很大,而设置字典通常需要字典本身的存储空间,所以设计上一定要小心谨慎。


8 其他过程

byte[] originalBytes = ...

     Deflater deflater = new Deflater();
     deflater.setInput(originalBytes);
     deflater.finish();

     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     byte[] buf = new byte[8192];
     while (!deflater.finished()) {
         int byteCount = deflater.deflate(buf);
         baos.write(buf, 0, byteCount);
     }
     deflater.end();

     byte[] compressedBytes = baos.toByteArray();

设置输入,压缩完成,将压缩得到内容写到内存中。

如果你需要使用相同的策略,无需创建一个新的压缩器,而是使用压缩器的reset()方法


<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值