分享

利用JAVA API函数实现数据的压缩与解压缩(2)

 aojilee 2006-11-28
利用JAVA API函数实现数据的压缩与解压缩(2)
http://www.51cto.com 2005-10-11 00:00 作者:夏治(Tim) 出处:51cto.com
【导读】这篇文章简要的介绍了数据的压缩与解压缩,并展示了用java.util.zip包来实现数据的压缩与解压缩是多么的方便与高效。
例程1源代码:

UnZip.java

import java.io.*;

import java.util.zip.*;

public class UnZip {

static final int BUFFER = 2048;

public static void main (String argv[]) {

try {

BufferedOutputStream dest = null;

FileInputStream fis = new

FileInputStream(argv[0]);

ZipInputStream zis = new

ZipInputStream(new BufferedInputStream(fis));

ZipEntry entry;

while((entry = zis.getNextEntry()) != null) {

System.out.println("Extracting: " +entry);

int count;

byte data[] = new byte[BUFFER];

// write the files to the disk

FileOutputStream fos = new

FileOutputStream(entry.getName());

dest = new

BufferedOutputStream(fos, BUFFER);

while ((count = zis.read(data, 0, BUFFER))

!= -1) {

dest.write(data, 0, count);

}

dest.flush();

dest.close();

}

zis.close();

} catch(Exception e) {

e.printStackTrace();

}}

}

有一点值得大家注意,类ZipInputStream读出ZIP文件序列(简单地说就是读出这个ZIP文件压缩了多少文件),而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容,所以不必顺序的读出ZIP压缩文件序列。

注意:ZIPInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候,ZIP条目不使用高速缓冲。然而,如果使用ZipFile(文件名)来打开文件,它将使用内嵌的高速缓冲,所以如果ZipFile(文件名)被重复调用的话,文件只被打开一次。缓冲值在第二次打开进使用。如果你工作在UNIX系统下,这是什么作用都没有的,因为使用ZipFile打开的所有ZIP文件都在内存中存在映射,所以使用ZipFile的性能优于ZipInputStream。然而,如果同一ZIP文件的内容在程序执行期间经常改变,或是重载的话,使用ZipInputStream就成为你的首选了。

下面显示了使用类ZipFile来解压一个ZIP文件的过程:

通过指定一个被读取的ZIP文件,或者是文件名,或者是一个文件对象来创建一个ZipFile对象:

ZipFile zipfile = new ZipFile("figs.zip");

使用entries方法,返回一个枚举对象,循环获得文件的ZIP条目对象:

while(e.hasMoreElements()) {

entry = (ZipEntry) e.nextElement();

// read contents and save them

}

ZIP条目作为参数传递给getInputStream方法,可以读取ZIP文件中指定条目的内容,能过其返回的输入流(InputStram)对象可以方便的读出ZIP条目的内容:

is = new BufferedInputStream(zipfile.getInputStream(entry));

获取ZIP条目的文件名,创建输出流,并保存:

byte data[] = new byte[BUFFER];

FileOutputStream fos = new FileOutputStream(entry.getName());

dest = new BufferedOutputStream(fos, BUFFER);

while ((count = is.read(data, 0, BUFFER)) != -1) {

dest.write(data, 0, count);

}

最后关闭所有的输入输出流 dest.flush();

dest.close();

is.close();

完整的程序代码如例程2所示。再次编译这个文件,并传递一个ZIP格式的文件做为参数:

prompt> java UnZip2 somefile.zip

例程2源码:

UnZip2.java

import java.io.*;

import java.util.*;

import java.util.zip.*;

public class UnZip2 {

static final int BUFFER = 2048;

public static void main (String argv[]) {

try {

BufferedOutputStream dest = null;

BufferedInputStream is = null;

ZipEntry entry;

ZipFile zipfile = new ZipFile(argv[0]);

Enumeration e = zipfile.entries();

while(e.hasMoreElements()) {

entry = (ZipEntry) e.nextElement();

System.out.println("Extracting: " +entry);

is = new BufferedInputStream

(zipfile.getInputStream(entry));

int count;

byte data[] = new byte[BUFFER];

FileOutputStream fos = new

FileOutputStream(entry.getName());

dest = new

BufferedOutputStream(fos, BUFFER);

while ((count = is.read(data, 0, BUFFER))

!= -1) {

dest.write(data, 0, count);

}

dest.flush();

dest.close();

is.close();

}

} catch(Exception e) {

e.printStackTrace();

}}

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多