Java核心技术(第8版) – 读书笔记 – 第10章

 

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.");
        }
    }
}

本章结束。

Leave a Reply

Your email address will not be published.