1、JAR包:实际是zip文件,里面可以包含.class文件(字节码),也可以包含其他图像、声音文件。
2、JDK5之后支持pack200格式,号称比传统的jar包压缩率更高。
3、创建jar包命令:
#格式 jar cvf JarFilename File1 File2 ... #例子 jar -cvf MyProxy.jar ./TestProxy.class
4、JAR包还应当包含一个清单文件(manifest.mf)。它位于JAR包/META-INF/MANIFEST.MF
5、如果想指定自己定义的manifest文件,可以在jar命令中加上-m选项:
jar -cfm JarFilename ManifestFilename
6、运行jar包,通常还要指定运行的Main类,复杂的打包还是交给Eclipse吧……
7、资源:jar包(实际是Java源代码路径下)可以包含的一系列需要使用的数据文件,如:
(1)图像、声音
(2)i18n的文本信息
(3)二进制数据文件等
8、操作资源文件的步骤:
(1)获取Class对象
(2)调用Class.getresource(filename)获得URL位置,URL对象
(3)Toolkit.getDefaultToolkit()然后getImage或者getAudioClip。
其他文件:
(1)获取Class
(2)Class.getResourceAsStream(filename) -> InputStream
(3)用Scanner等读取
9、关于资源文件的路径:
(1)/相对于java源代码根目录或者jar包根
(2)非/开头:相对于当前Class文件。
10、一个读取当前目录下文本资源文件的:
import java.util.Scanner; import java.io.*; public class TestResource { public static void main(String [] args) { InputStream in = TestResource.class.getResourceAsStream("about.txt"); Scanner scan = new Scanner(in); while(scan.hasNextLine()) { System.out.println(scan.nextLine()); } } }
11、Java的包密封(Seal),我觉得叫包封印更好……就是保证不会再有其他的类加入到其中。方法是在mainfest文件最后一行加入:Sealed:true
Java Applet的部分跳过,这个JNLP……已经过气很久了吧。
12、属性配置文件:java.util.Properties。实际上,这是Windows的ini的简化版本,没有section的概念,代码如下:
import java.util.Properties; import java.io.*; public class TestProperty { public static void main(String [] args) { //Save property Properties settings = new Properties(); settings.setProperty("host", "localhost"); settings.setProperty("port", "8080"); try { FileOutputStream out = new FileOutputStream("./db.properties"); settings.store(out, "I'm comment."); out.close(); } catch(Exception e) { System.out.println("Store properties fail."); } System.out.println("Store properties succ."); //Load property Properties settings2 = new Properties(); try { FileInputStream in = new FileInputStream("./db.properties"); settings2.load(in); in.close(); } catch(Exception e) { System.out.println("Load properties fail."); } System.out.println("Load properties succ."); System.out.println("Host:"+settings2.getProperty("host", "unknown_host_name")); System.out.println("Port:"+settings2.getProperty("port", "unknown_port_number")); System.out.println("Port:"+settings2.getProperty("name", "unknown_name")); } }
生成的配置文件如下:
#I'm comment. #Sat Dec 24 19:46:32 CST 2011 port=8080 host=localhost
settings2.getProperty(key, default_value) ,提供了当key不存在时,返回的默认值。
13、属性配置文件命名一般习惯用:.xxx.properties,并放置在用户家目录下(对于类Unix系统)
14、从JDK 1.4开始,提供了一个平台无关的java.util.prefs.Preferences类,用于简化并提供功能较强的配置操作。
15、Preferences提供的实际上是一个“知识库”,树状结构,类似windows的注册表。
16、系统中有多颗树,每个进程自己一颗:
Perferences user_root = Preferences.userRoot();
另外还有系统树,所有进程共用:
Perferences sys_root = Preferences.systemRoot();
访问结点:
user_root.node("/com/liheyuan/myapp")
这个路径path可以偷懒,如果注册树和类的包名路径相同的话:
Preferences sys_pref = systemNodeForPackage(getClass());
Preferences user_pref = userNodeForPackage(getClass());
提供了直接转化到类型的方法:
get(key, defStr)
getInt(key, defInt)
getFloat(key, defFloat)
getBoolean(key, defBool)
…………
不像Properties,这里必须指定默认值。
17、为了方便迁移配置,可以将整颗树导出成xml:
void exportSubtree(OutputStream os) void exportNode(OutputStream os)
18、一个Preferences的例子:
import java.util.prefs.Preferences; import java.io.*; public class TestPreferences { public static void main(String [] args) { //Way 1 Preferences pref1 = Preferences.userRoot(); Preferences node1 = pref1.node("/com/liheyuan/node"); node1.put("host", "localhost"); //Way 2 Preferences node2 = Preferences.userNodeForPackage(TestPreferences.class); node2.put("host", "10.0.0.22"); //Get Preferences node = Preferences.userNodeForPackage(TestPreferences.class); System.out.println("host:"+node.get("host", "unknown_host")); //export try { Preferences.userRoot().exportSubtree(new FileOutputStream("export.xml")); } catch(Exception e) { System.out.println("export fail."); } } }
本章结束。