Atitit.操做注册表 树形数据库 注册表的历史 java版本类库总结

Atitit.操做注册表 树形数据库 注册表的历史 java版本类库总结html

 

1. 注册表是树形数据库 1java

2. 注册表的由来 1node

3. Java  操做注册表 2数据库

3.1. 使用Preferences API (限定访问路径了) 2windows

3.2. 使用JNI 3this

3.3. Jregistrykey 推荐 4spa

3.4. Jregistry 4操作系统

4. org.openqa.selenium.os.WindowsUtils 4.net

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.com

转载请注明来源: 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注册表而设计的,这是值得指出的一点。

咱们之因此会有上面的误解是因为SunWindows版本的JDK在实现Preferences API时使用了Windows注册表做为存储库,即咱们用Preferences API存储的数据会保存到Windows注册表中,这样Preferenes API也就有了访问Windows注册表的能力。可是换到其它的平台或其它厂商的JDK实现又会怎么样呢?这个问题是和Preferences API的实现相关的,咱们没有办法回答。 

若是程序不关心存储库的细节,只是要找一个存放数据的地方,那么Preferences API很合适。

Preferences API也是有局限的,请您考虑两个问题: 

· 一个Java软件,此次我在SunJDK上运行并使用Preferences API保存了个人我的喜爱,下次我在IBMJDK上运行,这时个人我的喜爱还能够经过Preferences API获得吗?可能能够也可能不能够,这时的行为是由SunIBMPreferences 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,所以用JNIJava和这些API链接起来咱们就得到了用Java操做注册表的能力。这提及来有些简单,实现起来却须要处理大量的细节。幸运的是这样的工做已经有人作了,咱们要感谢他们。下面咱们就来看看其中的一个包。

com.ice.jni.registry包是经过JNI(Java native interface)实现的Windows注册表操做API,能够用来访问、修改和导出Windows注册表。如今这个包已经公开了,能够放心的使用而不 必担忧license的问题,而且包括一个构建好的DLLJavaC的源代码。它能够在Java 1.1和更高的版本上工做。 

 

2. 开源读写注册表的库 registry-3.1.3 主页地址:http://www.trustice.com/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

相关文章
相关标签/搜索