1. 注册表是树形数据库 1
2. 注册表的由来 1
3. Java 操作注册表 2
3.1. 使用 Preferences API (限定访问路径了) 2
3.2. 使用 JNI 3
3.3. Jregistrykey 推荐 4
3.4. Jregistry 4
4. org.openqa.selenium.os.WindowsUtils 4
4.1. 以及进程管理 4
1. 注册表是树形数据库
树形数据库,但不提供类似SQL的查询接口
2. 注册表的由来
在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测试数据
转载请注明来源: http://blog.csdn.net/attilax
3. Java 操作注册表
3.1. 使用 Preferences API (限定访问路径了)
由于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 位置插入三个键值
3.2. 使用 JNI
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://HdhCmsTesttrustice测试数据/java/jnireg/index.shtml
下载后需要将ICE_JNIRegistry.dll放到目前正在用的 jdk的bin目录下
3.3. Jregistrykey 推荐
3.4. Jregistry
jRegistry通过JNI技术来访问WINDOWS注册表API。
4. org.openqa.selenium.os.WindowsUtils
writeIntRegistryValue
writeStringRegistryValue
runRegQuery
4.1. 以及进程管理
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
Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结
标签:
查看更多关于Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结的详细内容...