Java数据压缩格式程序设计方法之JAR压缩格式

1、JAR格式文件介绍

在JDK1.1版中,定义了用于将与Java应用程序相关的多个文件以及相关资源整合在一起的数据文件类型-JAR。也许读者会注意到:Sun以及其它公司发布的多种类型Java库都是以JAR形式进行文件压缩和封装的。

从本质上讲,JAR压缩文件采用ZIP格式进行数据压缩。由于最初引入JAR数据压缩类型的目的在于将开发完成的软件进行进行发布,因此,在JDK中定义了JAR类型文件管理工具,用于创建、浏览、解压缩以及执行JAR文件等操作。另外,在JDK API中还定义了封装在java.util.jar包中的多个对象,用于在Java应用程序中对JAR文件进行管理。

2、 利用JDK工具操作JAR文件

在JDK安装目录的bin子目录中,包括名称为“jar.exe”的可执行程序。该程序在执行过程中可以利用如下表所示的各个选项,实现JAR文件的多种类型操作:


表1 JDK压缩文件管理工具应用选项表




那么,对于包含了class字节码文件和包含相应资源文件的一个目录,利用JDK文档管理工具,如何创建JAR文件从而实现数据压缩的呢?让我们看下面的例子:

例如,对于一个要发布的软件项目Demo,在该目录中包括一个名称为Demo.class的Java字节码文件和包含声音文件的目录Audio、包含图片文件的目录Images,如下图所示:





那么,利用下面的命令即可实现将Demo项目创建成可发布的JAR类型压缩文档:

C:>jar cvf Demo.jar Demo.class Audio Images

利用上述命令创建的JAR类型压缩文件不仅将Demo目录中的多种资源进行打包,而且将这些数据文件进行了压缩。如果读者不需要在打包过程中进行数据压缩,可以设置jar执行选项为“cvf0”。

如果利用jar工具的tf选项查看新创建的JAR文件,读者会发现在该文件中新增了名称为META-INF的目录,在该目录中包含MANIFEST.MF文件,该文件的作用是什么呢?总的说来:由于在创建JAR文件过程中可以进行数字签名、版本控制、包封装以及多种类型的功能扩展,因此,MANIFEST.MF文件即用于说明当前的JAR文件在创建过程中采用了何种类型的功能扩展,典型的MANIFEST.MF文件代码如下:


Manifest-Version: 1.0
Name: java/math/BigDecimal.class
SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=
MD5-Digest: z6z8xPj2AW/Q9AkRSPF0cg=




该文件的代码说明了压缩文件采用的数字签名内容。

3、 JAR包对象定义结构

除了可以利用JAR文档管理工具对jar文件进行管理之外,在JDK API中,还定义了java.util.jar包,其中封装了用于在Java应用程序中创建、维护和操作jar文件的多种类型对象,主要对象包括:

Attributes:用于将JAR文件中说明属性内容映射到该类的各个字符串变量中;

JarEntry:用于对应JAR文件中封装的各个被压缩文件;

JarFile:对应磁盘文件系统中的JAR压缩文档对象;

JarInputStream:从JAR文件中读取压缩内容的流对象;

JarOutputStream:创建JAR文件的流对象;

Manifest:对应JAR文件中说明内容的对象。

在实际的应用程序设计过程中,与创建和管理JAR压缩文档相关的对象为JarInputStream和JarOutputStream。在下面的内容中,将演示在Java应用程序中创建JAR类型压缩文档的方法。
4、创建JAR文档应用程序设计方法

下面的代码为创建JAR类型压缩文档的Java应用程序代码:


//JARDemo.java
import java.io.*;
import java.util.jar.*;
public class JARDemo
{
public static void main(String[] args)
{
if (args.length !=2 )
{
System.out.println("请输入被压缩文件的名称和压缩文件的名称!");
System.exit(1);
}
try
{
//创建文件输入流对象
FileInputStream in = new FileInputStream( args[0] );
//创建文件输出流对象
FileOutputStream out = new FileOutputStream( args[1] );
//创建JAR数据输出流对象
JarOutputStream jarOut = new JarOutputStream( out );
//创建指向压缩原始文件的入口
JarEntry entry = new JarEntry( args[0] );
jarOut.putNextEntry( entry );
//向压缩文件中输出数据
int nNumber;
byte[] buffer = new byte[512];
while ((nNumber=in.read(buffer)) != -1)
jarOut.write(buffer,0,nNumber);
//关闭创建的流对象
jarOut.close();
out.close();
in.close();
}
catch(IOException e)
{
System.out.println( e );
}
}




在该程序的实现代码中,首先创建用于进行文件输入和输出的FileInputStream和FileOutputStream对象,并以FileOutputStream对象实例为参数创建JarOutputStream对象实例,从而为创建JAR格式压缩文件建立数据流基础。

在随后的代码中,以被压缩文件的文件名为参数,创建在JAR压缩文件中指向压缩原始文件的Entry对象实例,并利用putNextEntry方法将该Entry存储进入压缩文件中。最后,利用JAROutputStream对象中定义的write方法向输出流中写出从压缩原始文件中读取的数据,从而创建JAR格式的压缩文件。

利用Java语言创建JAR格式压缩文件的方法很简单,那么,如何利用JDK API中定义的对象将被压缩的文件解压缩呢?请读者看下一节的内容。

5、 JAR文档解压缩方法

下面的程序代码用于将JAR类型文档解压缩后,恢复成为独立的数据文件:


//UnjarDemo.java
import java.io.*;
import java.util.jar.*;
public class UnjarDemo
{
public static void main(String[] args)
{
if ( args.length !=2 )
{
System.out.println("Usage:java UnjarDemo ");
System.exit(1);
}
try
{
//创建文件输入流对象实例
FileInputStream in = new FileInputStream( args[0] );
//创建Zip压缩格式输入流对象实例
JarInputStream jarin = new JarInputStream( in );
//创建文件输出流对象实例
FileOutputStream out = new FileOutputStream( args[1] );
byte[] buffer = new byte[1024];
int nNumber;
while ((nNumber = jarin.read(buffer, 0, buffer.length)) != -1)
out.write(buffer, 0, nNumber);
//关闭文件流对象
jarin.close();
out.close();
in.close();
}
catch(IOException e)
{
System.out.println(e);
}
}
}




该程序的代码结构不是很复杂,请读者自行分析该文件中的对象应用形式以及JAR压缩文件解压缩方法。

6、 小结

在本部分的内容中,首先介绍了JAR类型文档的结构和JDK中jar文档管理工具的应用方法。在随后的内容中,以java.util.jar包中的应用对象为基础,讲解了Java语言创建和维护jar压缩文档程序设计方法。

你可能感兴趣的:(java,jdk,数据结构,项目管理,sun)