尽管存在许多种压缩算恙,但是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. java maven 操作 收集的一些命令

    maven打包: mvn clean package -Dmaven.test.skip=true 运行jar: java -jar target/spring-boot-scheduler-1.0. ...

  2. Spring boot错误处理以及定制错误页面

    如果是浏览器访问,返回错误页面 注意浏览器发送请求的请求头:  注意区别其他客户端哦比如 postman 如果是其他客户端,返回一个Json数据 原理可以参照ErrorMvcAutoConfigura ...

  3. install ros-indigo-camera-info-manager

    CMake Warning at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake: (find_package): Could not fi ...

  4. 关于 Flutter的Button按钮没有高度设置

    flutter 里面 RaisedButton.FloatingActionButton.FlatButton.OutlineButton 中四个button都无高度设置,如下用RaisedButto ...

  5. 数据模板--DataTemplate

    DataTemplate 的 "DataType" 通常就是 “ViewModel” ——视图模型(亦可不恰当称之为:数据模型) <DataTemplate DataType ...

  6. 随机梯度下降算法求解SVM

    测试代码(matlab)如下: clear; load E:\dataset\USPS\USPS.mat; % data format: % Xtr n1*dim % Xte n2*dim % Ytr ...

  7. js数字进制转换

    其他进制转十进制: 使用 parseInt()函数,parseInt解析一个字符串参数,并返回一个指定基数的整数 ,用法如下: parseInt(string, radix); 以二进制为例,用法如下 ...

  8. 【MVC】ASP.NET MVC 4项目模板的结构简介

    引言     在VS2012新建一个窗体验证的MVC 4项目后,可以看到微软已经帮我们做了很多了,项目里面该有的都有了,完全可以看成一个简单网站.作为开发,能理解里面文件结构和作用,也算是半只脚踏进M ...

  9. FIS 的思想和优点

    资源表 各种性能优化算法的加载框架 依赖声明有助于组件化 资源自动合并 链接 与webpack对比

  10. iOS-----线程同步与线程通信

    线程同步与线程通信 多线程是有趣的事情,它很容易突然出现”错误情况”,这是由于系统的线程调度具有一定的随机性造成的.不过,即使程序偶然出现问题,那么是由于编程不当所引起的.当使用多个线程来访问同一个数 ...