Atitit.操做注册表 树形数据库 注册表的历史 java版本类库总结html
1. 注册表是树形数据库 1java
2. 注册表的由来 1node
3.1. 使用Preferences API (限定访问路径了) 2windows
3.2. 使用JNI 3this
3.4. Jregistry 4操作系统
4. org.openqa.selenium.os.WindowsUtils 4.net
树形数据库,但不提供相似SQL的查询接口
在Windows 3.x操做系统中,注册表是一个极小文件,其文件名为Reg.dat,里面只存放了某些文件类型的
应 用程序关联,大部分的设置放在Win.ini、System.ini等多个初始化INI文件中。因为这些初始化文件不便于管理和维护,时常出现一些因 INI文件遭到破坏而致使系统没法启动的问题。为了使系统运行得更为稳定、健壮,Windows 95/98设计师们借用了Windows NT中的注册表的思想,将注册表引入到Windows 95/98操做系统中,并且将INI文件中的大部分设置也移植到注册表中,所以,注册表在Windows 95/98操做系统的启动、运行过程当中起着重要的做用。
做者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
因为java程序是“write once, run everywhere”,用java读写注册表,那程序的跨平台性就差了。java对注册表的操做,在jdk1.4之前的版本中,那是不可能的,只能用 JNI来实现;然而jdk1.4以后提供的prefs包能够操做windows注册表,不过定死了root只在SOFTWARE/JavaSoft /prefs下,估计也是出于这种两难吧,又要保证所谓平台无关,还要照顾你们对windows的依赖
。而 JDK 提供操做 Windows 的 API 也就是 Preferences,由于这个 API 也是跨平台的,所功能比较弱,在 Win32 下只能用来操做 HKCU\Software\JavaSoft 和 HKLM\Software\JavaSoft 下及子节点的数据。
自由访问注册表其余键的值光用 Java 是作不到的,必然方案就是 JNI,
Preferences API并非为访问Windows注册表而设计的,这是值得指出的一点。
咱们之因此会有上面的误解是因为Sun的Windows版本的JDK在实现Preferences API时使用了Windows注册表做为存储库,即咱们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。可是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,咱们没有办法回答。
若是程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。
Preferences API也是有局限的,请您考虑两个问题:
· 一个Java软件,此次我在Sun的JDK上运行并使用Preferences API保存了个人我的喜爱,下次我在IBM的JDK上运行,这时个人我的喜爱还能够经过Preferences API获得吗?可能能够也可能不能够,这时的行为是由Sun和IBM的Preferences API实现决定的。(在相同的JDK实现上可使用Preferences API来在不一样的程序间共享数据)
· 一个Java软件须要让用户设置是否和操做系统一块儿启动,相似的需求还不少。这类需求就是要求Java程序有真正的和相关操做系统协同的能力。这种能力不是Preferences API的设计目标。
java读写注册表须要用到两种方式:
1. java.util.prefs.* 中的包
其中 Preferences.systemRoot() 获得的是 HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs 能够在此位置之下方便的进行注册表的 读写
Preferences.userRoot() 获得的是 HKEY_LOCAL_USER/Software/JavaSoft/prefs,能够在此位置下进行注册表
可是对其余
位置操做就不方便。
示例代码:
import java.util.prefs.*;
public class Registery {
String[] keys = {"aaa", "bbb", "ccc"};
String[] values = {"1", "2", "3"};
//把相应的值储存到变量中去
public void writeValue() {
// HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs下写入注册表值.
Preferences pre = Preferences.systemRoot().node("/javaplayer");
for (int i = 0; i < keys.length; i++) {
pre.put(keys, values);
}
}
public static void main(String[] args) {
Registery reg = new Registery();
reg.writeValue();
}
}
执行代码的结果会在 HKEY_LOCAL_MACHINE/Software/JavaSoft/prefs/javaplayer 位置插入三个键值
Windows操做系统提供了操做注册表的API,所以用JNI将Java和这些API链接起来咱们就得到了用Java操做注册表的能力。这提及来有些简单,实现起来却须要处理大量的细节。幸运的是这样的工做已经有人作了,咱们要感谢他们。下面咱们就来看看其中的一个包。
com.ice.jni.registry包是经过JNI(Java native interface)实现的Windows注册表操做API,能够用来访问、修改和导出Windows注册表。如今这个包已经公开了,能够放心的使用而不 必担忧license的问题,而且包括一个构建好的DLL和Java、C的源代码。它能够在Java 1.1和更高的版本上工做。
2. 开源读写注册表的库 registry-3.1.3 主页地址:http://www.trustice.com/java/jnireg/index.shtml
下载后须要将ICE_JNIRegistry.dll放到目前正在用的 jdk的bin目录下
jRegistry经过JNI技术来访问WINDOWS注册表API。
writeIntRegistryValue
writeStringRegistryValue
runRegQuery
public static void main(String[] args) throws Exception {
Line 50: public static void traceWith(Logger log) {
Line 54: public static void killByName(String name) {
Line 58: public static void tryToKillByName(String name) {
Line 68: public static void kill(String[] cmdarray) throws Exception {
Line 126: private static void killPID(String processID) {
Line 131: public static Map<String, String> procMap() throws Exception {
Line 171: public static synchronized Properties loadEnvironment() {
Line 182: public static String getProgramFilesPath() {
Line 186: public static String getProgramFiles86Path() {
Line 190: private static String getEnvVarPath(String envVar, String defaultValue) {
Line 201: public static ImmutableList<String> getPathsInProgramFiles(String childPath) {
Line 207: private static String getFullPath(String parent, String child) {
Line 211: public static String getLocalAppDataPath() {
Line 220: public static String getEnvVarIgnoreCase(String var) {
Line 230: public static File findSystemRoot() {
Line 250: public static String findWMIC() {
Line 267: public static File findWBEM() {
Line 280: public static String findTaskKill() {
Line 295: public static String findReg() {
Line 319: public static boolean isRegExeVersion1() {
Line 330: public static Class<?> discoverRegistryKeyType(String key) {
Line 358: public static String readStringRegistryValue(String key) {
Line 384: public static int readIntRegistryValue(String key) {
Line 418: public static boolean readBooleanRegistryValue(String key) {
Line 431: public static boolean doesRegistryValueExist(String key) {
Line 452: public static void writeStringRegistryValue(String key, String data)
Line 477: private static String executeCommand(String commandName, String[] args) {
Line 489: public static void writeIntRegistryValue(String key, int data) {
Line 517: public static void writeBooleanRegistryValue(String key, boolean data) {
Line 521: public static void deleteRegistryValue(String key) {
Line 540: private static String runRegQuery(String key) {
Line 556: public static boolean thisIsWindows() {
Line 560: private static class RegKeyValue {
参考
Atitit.各类 数据类型 ( 树形结构, ) 的结构与存储数据库 attilax 总结.doc