尽管存在许多种压缩算恙,但是Zip和GZIP可能是最常用的.因此我们可以很容易地使用多
种可读写这些格式的工具来操纵我们的压缩数据。
 
1 用GZIP进行简单压缩
GZIP接口非常简单, 因此如果我们只想对单个数据流(而不是一系列互异数据)进行压缩,
那么它可能是比较适合的选择。下面是对单个文件进行压缩的例子:
// {Args: GZIPcompress.java}
package com.java.io; import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream; public class GZIPcompress {
public static void main(String[] args) throws IOException {
if(args.length == 0) {
System.out.println(
"Usage: \nGZIPcompress file\n" +
"\tUses GZIP compression to compress " +
"the file to test.gz");
System.exit(1);
}
BufferedReader in = new BufferedReader(new FileReader(args[0]));
BufferedOutputStream out = new BufferedOutputStream(
new GZIPOutputStream(
new FileOutputStream("test.gz")));
System.out.println("Writing file");
int c;
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.close();
System.out.println("Reading file");
BufferedReader in2 = new BufferedReader(
new InputStreamReader(new GZIPInputStream(
new FileInputStream("test.gz"))));
String s;
while((s = in2.readLine()) != null){
System.out.println(s);
}
in2.close();
}
}
压缩类的使用非常直观一一直接将输出流封装成GZlPOutputStream或ZipOutputStream,并将
输入流封装成GZIPInputStream或ZipInputStream即可。其他全部操作就是通常的IO读写。这个例
子把面向字符的流和面向字节的流棍合了起来,输入(in ) 用Reader类,而GZIPOutputStream的
构造器只能接受OutputStream对象,不能接受Writer对象。在打开文件时, GZIPInputStream就会
被转换成Reader.
 

2.用Zip进行多文件保存
支持Zip格式的Java 库更加全面.利用该库可以方便地保存多个文件,它甚至有一个独立的
类,使得读取Zip文件更加方便.这个类库使用的是标准Zip格式,所以能与当前那些可通过因
特网下载的压缩工具很好地协作. 下面这个例子具有与前例相同的形式,但它能根据需要来处
理任意多个命令行参数。另外,它显示了用Checksum类来计算和校验文件的校验和的方法。
共有两利Checksum类型: Adler32 (它快一些) 和CRC32 (慢一些, 但更准确)。
// Uses Zip compression to compress any
// number of files given on the command line.
// {Args: ZipCompress.java}
package com.java.io; 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.io.IOException;
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; import static com.java.util.Print.*; public class ZipCompress {
public static void main(String[] args) throws IOException {
FileOutputStream f = new FileOutputStream("test.zip");
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
BufferedOutputStream out = new BufferedOutputStream(zos);
zos.setComment("A test of Java Zipping"); // No corresponding getComment(), though.
for(String arg : args) {
print("Writing file " + arg);
BufferedReader in = new BufferedReader(new FileReader(arg));
zos.putNextEntry(new ZipEntry(arg));
int c;
while((c = in.read()) != -1){
out.write(c);
}
in.close();
out.flush();
}
out.close(); // Checksum valid only after the file has been closed!
print("Checksum: " + csum.getChecksum().getValue()); // Now extract the files:
print("Reading file");
FileInputStream fi = new FileInputStream("test.zip");
CheckedInputStream csumi = new CheckedInputStream(fi, new Adler32());
ZipInputStream in2 = new ZipInputStream(csumi);
BufferedInputStream bis = new BufferedInputStream(in2);
ZipEntry ze;
while((ze = in2.getNextEntry()) != null) {
print("Reading file " + ze);
int x;
while((x = bis.read()) != -1){
System.out.write(x);
}
}
if(args.length == 1){
print("Checksum: " + csumi.getChecksum().getValue());
}
bis.close(); // Alternative way to open and read Zip files:
ZipFile zf = new ZipFile("test.zip");
Enumeration<? extends ZipEntry> e = zf.entries();
while(e.hasMoreElements()) {
ZipEntry ze2 = e.nextElement();
print("File: " + ze2);
// ... and extract the data as before
}
}
}
  对于每一个要加入压缩档案的文件,都必须调用putNextEntry() ,并将其传递给一个
ZlpEntry对象。ZipEntry对象包含了一个功能很广泛的接口,允许你获取和设置Zip文件内该特
定项上所有可利用的数据: 名字、压缩的和未压缩的文件大小、日期、CRC校验和、额外字段数
据、注释、压缩方法以及它是否是一个目录入口等等.然而,尽管Zip格式提供了设置密码的方
法.但Jav啪Zip类库并不提供这方面的支持。虽然CheckedlnputStream和CheckedOutputStream
都支持Adler32和CRC32两种类型的校验和,但是ZjpEntry类只有一个支持CRC的接口.虽然这
是一个底层Zip格式的限制,但却限制了人们不能使用速度更快的Adler32 .
  为了能够解压缩文件, ZiplnputStream提供了一个getNextEntry()方法返回下一个ZipEntry
(如果存在的话).。解压缩文件有一个更简便的方法一一利用ZipFile对象读取文件。该对象有一
个entries()方法用来向ZipEntries返回一个Enumeration (枚举).
  为了读取校验和,必须拥有对与之相关联的Checksum对象的访问权限。在这里保留了指向
CheckedOutputStream和CheckedlnputStream对象的引用.但是,也可以只保留一个指向Checksum对象的引用。
  Zip流中有一个令人困惑的方法setComment() . 正如前面ZipCompress.java中所示, 我们可
以在写文件时写注释,但却没有任何方法恢复ZiplnputStreaIn内的注释.似乎只能通过ZipEntry ,
才能以逐条方式完全支持注释的获取。
  当然, GZIP或Zip库的使用并不仅仅局限于文件一它可以压缩任何东西,包括需要通过网络发送的数据.

3.

-----------

ThinkJava-压缩的更多相关文章

  1. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  2. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  3. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  4. linux 如何对文件解压或打包压缩

    tar命令用与对文件打包压缩或解压,格式: tar [选项] [文件] 打包并压缩文件: tar -czvf  压缩包名 .tar.gz 解压并展开压缩包: tar -xzvf  压缩包名 .tar. ...

  5. linux压缩和解压缩命令大全

    .tar 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName ------------------------------------- ...

  6. 快速开发Grunt插件----压缩js模板

    前言 Grunt是一款前端构建工具,帮助我们自动化搭建前端工程.它可以实现自动对js.css.html文件的合并.压缩等一些列操作.Grunt有很多插件,每一款插件实现某个功能,你可以通过npm命名去 ...

  7. H5图片压缩与上传

    接到需求,问前端是否可以压缩图片?因为有的图片太大,传到服务器上再压缩太慢了.意识里没有这么玩过,早上老大丢来一个知乎链接,一看,原来前辈们已经用canvas实现了(为自己的见识羞愧3秒钟,再马上开干 ...

  8. 压缩javascript文件方法

    写在前面的话:正式部署前端的时候,javascript文件一般需要压缩,并生成相应的sourcemap文件,对于一些小型的项目开发,这里提供一个简单的办法. ======正文开始====== 1.下载 ...

  9. HTML5网页录音和压缩,边猜边做..(附源码)

    宣传一下自己的qq群: (暗号:C#交流) 欢迎喜欢C#,热爱C#,正在学习C#,准备学习C#的朋友来这里互相学习交流,共同进步 群刚建,人不多,但是都是真正热爱C#的 我也是热爱C#的 希望大家可以 ...

  10. PHP日志压缩下载

    主要实现了在后台查看日志列表及打包下载功能. 由于用到了PHP压缩功能,特此记录下. 压缩下载类: Hzip.php <?php /** * Created by PhpStorm. * @au ...

随机推荐

  1. Xshell5 访问虚拟机Ubuntu16.04

    1.Ubuntu安装telnet 安装openbsd-inetd sudo apt-get install openbsd-inetd 安装telnetd sudo apt-get install t ...

  2. 试着用React写项目-利用styled-components解决样式问题

    转载请注明出处:王亟亟的大牛之路 啰嗦之前先安利,会渐渐丰富前端的知识点 https://github.com/ddwhan0123/Useful-Open-Source-Android 昨天用web ...

  3. 【bzoj4972】小Q的方格纸 前缀和

    题目让O(1)预处理出来 类三角形边界及内部的和 根据这个图 就是一个大矩形-左边的绿色的矩形 - 蓝色的大三角形 + 右上角突出的蓝色的小三角形 #include<bits/stdc++.h& ...

  4. Vue+Webpack配置css-loader时报错:Module build failed: Unknown word

    使用Vue+Webpack搭建工程时,在webpack.config.js中的module的rules里针对各种文件配置加载工具.在针对css文件配置时遇到一个问题:打包构建时报错——Module b ...

  5. UVa 11552 最小的块数(序列划分模型:状态设计)

    https://vjudge.net/problem/UVA-11552 题意:输入一个正整数k和字符串S,字符串的长度保证为k的倍数.把S的字符按照从左到右的顺序每k个分成一组,每组之间可以任意重排 ...

  6. git submodule临时分支;以及git reset使用

    submodule 已经建立好了一个gitlab submodule形式的repo: 在repo A下面有一个submodule B, A --> B. clone -b branch [rep ...

  7. zookeeper和Eureka对CAP理论的支持

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡.在此Zookeeper保证 ...

  8. Spring Boot安装

    Spring引导依赖项groupId使用org.springframework.boot. 通常Maven POM文件将继承自spring-boot-starter-parent项目,并将依赖性声明为 ...

  9. [转] oracle 监听

    oracle 监听 启动监听:lsnrctl start 查看监听:lsnrctl status 停止监听:lsnrctl stop 1.oracle 数据服务器包括:实例进程和数据库: 实例进程包括 ...

  10. Leetcode 35

    //在数组最后插入INT_MAX是个好方法class Solution { public: int searchInsert(vector<int>& nums, int targ ...