JDK1.4为我们提供的java.util.prefs包,里面有一个Preferences类,能让以上的工作变得极其轻松!
写VB程序的人常常用SaveSetting函数和getSettging来存取注册表中的用户设定数据。而Java的Preferences类也提供了类似的机制。
如果我说Java里面可以不使用JNI的手段操作Windows的注册表你信不信?很多软件的菜单里都有“Setting”或“Preferences”这样的选项用来设定或修改软件的配置,这些配置信息可以保存到一个像上面所述的配置文件当中,如果是Windows平台下,也可能会保存到系统注册表中。从JDK 1.4开始,Java在java.util下加入了一个专门处理用户和系统配置信息的java.util.prefs包,其中一个类Preferences是一种比较“高级”的玩意。从本质上讲,Preferences本身是一个与平台无关的东西,但不同的OS对它的SPI(Service Provider Interface)的实现却是与平台相关的,因此,在不同的系统中你可能看到首选项保存为本地文件、LDAP目录项、数据库条目等,像在Windows平台下,它就保存到了系统注册表中,Linux中它存在于用户目录下的一个隐藏文件中。不仅如此,你还可以把首选项导出为XML文件或从XML文件导入。
主要类与方法和描述
systemNodeForPackage() //根据指定的Class对象得到一个Preferences对象,这个对象的注册表路径是从“HKEY_LOCAL_MACHINE\”开始的
systemRoot() //得到以注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Javasoft\Prefs 为根结点的Preferences对象
userNodeForPackage() //根据指定的Class对象得到一个Preferences对象,这个对象的注册表路径是从“HKEY_CURRENT_USER\”开始的
userRoot() //得到以注册表路径HKEY_CURRENT_USER\SOFTWARE\Javasoft\Prefs 为根结点的Preferences对象
putXXX() //设置一个属性的值,这里XXX可以为基本数值型类型,如int、long等,但首字母大写,表示参数为相应的类型,也可以不写而直接用put,参数则为字符串
getXXX() //得到一个属性的值
exportNode() //将全部首选项导出为一个XML文件
exportSubtree() //将部分首选项导出为一个XML文件
importPreferences() //从XML文件导入首选项
你可以按如下步骤保存数据:
Preferences myPrefs1 = Preferences.userNodeForPackage(this);// 这种方法是在“HKEY_CURRENT_USER\”下按当前类的路径建立一个注册表项
Preferences myPrefs2 = Preferences.systemNodeForPackage(this);// 这种方法是在“HKEY_LOCAL_MACHINE\”下按当前类的路径建立一个注册表项
Preferences myPrefs3 = Preferences.userRoot().node("com.jungleford.demo");// 这种方法是在“HKEY_CURRENT_USER\SOFTWARE\Javasoft\Prefs\”下按“com\jungleford\demo”的路径建立一个注册表项
Preferences myPrefs4 = Preferences.systemRoot().node("com.jungleford.demo");// 这种方法是在“HKEY_LOCAL_MACHINE\SOFTWARE\Javasoft\Prefs\”下按“com\jungleford\demo”的路径建立一个注册表项
myPrefs1.putInt("key1", 10);
myPrefs1.putDouble("key2", -7.15);
myPrefs1.put("key3", "value3");
FileOutputStream out = new FileOutputStream("prefs.xml");
myPrefs1.exportNode(out);
最终如果导出来可以看到的XML文件的形式如下;
----------------------
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user"> <!--userRoot()--->
<map/>
<node name="PreferenceTest">
<map>
<entry key="Test2" value="Hello Europa"/>
<entry key="Test3" value="45"/>
</map>
</node>
</root>
</preferences>
----------------------
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="system">
<map/>
<node name="fanfu">
<map>
<entry key="Test2" value="Hello Europa"/>
<entry key="Test3" value="45"/>
</map>
</node>
</root>
</preferences>
----------------------
相应的JAVA代码
----------------------
import java.util.prefs.Preferences;
import java.io.*;
public class PreferenceTest {
private Preferences prefs;
public void setPreference() {
// This will define a node in which the preferences can be stored
prefs = Preferences.userRoot().node("fanfu");
String ID1 = "Test1";
String ID2 = "Test2";
String ID3 = "Test3";
prefs.remove(ID1);
prefs.remove(ID2);
prefs.remove(ID3);
// First we will get the values
// Define a boolean value
System.out.println(prefs.getBoolean(ID1, true));
// Define a string with default "Hello World
System.out.println(prefs.get(ID2, "Hello World"));
// Define a integer with default 50
System.out.println(prefs.getInt(ID3, 50));
// Now set the values
prefs.putBoolean(ID1, false);
prefs.put(ID2, "Hello Europa");
prefs.putInt(ID3, 45);
System.out.println("------------------------------");
System.out.println(prefs.getBoolean(ID1, true));
System.out.println(prefs.get(ID2, "Hello World"));
System.out.println(prefs.getInt(ID3, 50));
// Delete the preference settings for the first value
prefs.remove(ID1);
System.out.println("------------------------------");
System.out.println(prefs.getBoolean(ID1, true));
System.out.println(prefs.get(ID2, "Hello World"));
System.out.println(prefs.getInt(ID3, 50));
}
public static void main(String[] args) throws Exception {
PreferenceTest test = new PreferenceTest();
test.setPreference();
for(String key : test.prefs.keys())
{
System.out.println(test.prefs.get(key,null));
}
FileOutputStream out = new FileOutputStream("out2.xml");
test.prefs.exportNode(out);
}
}