jar既可包含类文件,也可以包含诸如图像声音等其他类型文件,jar文件是采用ZIP格式压缩的。
创建格式:
jar cvf JARFileName File1 File2 ...
例如:
jar cvf CalculatorClasses.jar *.class icon.gif
jar 命令格式:
jar options File1 File2 ...
选项:
每个JAR文件包含一个用于描叙归档特征的清单文件(manifest)
清单文件名:MANIFEST.MF,位于JAR文件一个特殊META-INF子目录中。
清单条目被分成多个节。第一节为主节(main section).作用于整个JAR文件。随后的条目用来指定已命条目属性,这些已命名条目可以是某个文件,包或URL。必须起始于名为Name的条目。节与节之间用空行分割。如:
ManiFest-Version:1.0 描叙这个归档文件的行 Name:Wcozle.class 描述这个文件的行 Name:com/mycompany/mypkg/ 描述这个包的行
想要编辑清单文件,需要将希望添加到清单文件中的行放到文本文件中,运行:
jar cfm JARFileName ManifestFileName ...
例如:
jar ufm MyArchive.jar manifest.mf com/mycompany/mypkg/*.class
更多参看http://java.sun.com/javase/6/docs/technotes/guides/jar.
Java SE6中,可用jar命令的e 选项指定程序的条目点,即通常需要在调用Java程序加载器时指定的类:
jar cvfe MyProgram.jar com.mycompany.mypkg.MainAppClass files to add
用户可简单的启动应用程序:
java -jar MyProgram.jar
在旧的JDK中,必须指定应用程序主类:
Main-Class: com.mycompany.mypkg.MainAppClass
不要将扩展名.class添加到主类名中。然后运行:
jar cvfm MyProgram.jar mainclass.mf files to add
注意:清单文件最后一行必须以换行符结束。
一些相关数据文件如:
图像和声音文件
带有消息字符串和按钮标签的文本文件
二进制数据文件
类加载器知道如何搜索类文件,直到在类路径、存档文件、或Web服务器上找到为止,利用资源机制,对非类文件也可以同样方便地操作。必要步骤如下:
获得具有资源的Class对象,例如AboutPane.class
如果是图像或声音,需要调用getresource(filename)获得URL资源位置,再利用getImage或getAudioClip读取
其他资源可用getResourceAsStream读取文件中的数据
重点在于类加载器可以记住如何定位类,然后在同一位置查找关联资源
如图片:
URL url = ResourceTest.class.getResource("about.gif"); Image image = Tookit.getDefualtTookit().getImage(url);
在找到ResourceTest类的地方,然后在同位置查找关联资源。
如文件:
ImputStream stream = ResourceTest.class.getResourceAsStream("about.txt"); Scanner in = new Scanner(stream);
除了可以将资源文件和类文件放在同一目录外,还可以将它放在子目录中。可使用层级资源名:data/text/about.txt.这是一个相对资源名,他会被解释为相对于加载这个资源的类所在的包。而以"/"开头的,如:/corejava/titile.txt.定位于corejava目录下(他可能是类路径的一个子目录,也可能位于JAR文件中,对applet在web服务器上).
属性映射:存储键/值对的数据结构。用来存放配置信息。三个特性:
键和值都是字符串
键/值对可以很容易地写入文件或从文件读出
用二级表存放默认值
实现属性映射的类为Properties。如:
Properties settings = new Properties(); settings.put("width","200"); settings.put("title","Hello world");
可用store将这个属性映射列表保存到文件。在这里将属性映射保存在Myprog.properties文件中。
FileOutputStream out = new FileOutputStream("program.properties"); settings.store(out,"Program Properties"); //第二个参数为这个文件的注
从文件加载这些属性:
FileInputStream in = new FileInputStream("program.properties"); settings.load(in);
习惯将属性存储在用户主目录的某个子目录下。查看用户主目录调用System.getProperties方法。 还可以使用Properties对象描述系统信息。主目录包含键user.home。一个很有用的方法,读取单键:
String userDir = System.getProperties("user.name");
一旦用户手工的编辑文件,为应用程序提供 默认值就是一种很好的想法。Properties类有两种提供默认值的机制。第一种是在试图获得字符串值是指定默认值。当键值不存在时,就会自动的使用它。
String title = settings.getProperties("title","Defualt title");
如果属性映射中有title属性,则title设置成字符串,否则,title将设置成Default title。
如果觉得每次调用getProperties指定默认值太麻烦,可将所有默认值放在一个二级属性映射中,并在主属性映射的构造器中提供映射。且用它来够造查询表。
Properties defaultSettings = new Properties(); defaultSettings.put("width","300"); defaultSettings.put("height","200"); defaultSettings.put("title","Default title"); ... Properties settings = new Properties(defaultSettings);
属性文件的不足:
配置文件不能存放在用户的主目录中。(有些操作系统没有主目录的概念)
没有标准的为配置文件命名的规则。用户安装多个Java应用程序,会增加配置文件的冲突。