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

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

 

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

 

转载于:https://www.cnblogs.com/attilax/p/5963697.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# xml文件读取与修改

c#读写xml文件已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外连接从表过滤

1、使用left join时从表的过滤 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

php pcntl 多进程学习

1、捕获子进程退出&#xff08;监听SIGCHLD信号&#xff0c;然后调用 pcntl_wait 函数&#xff09; declare(ticks1);pcntl_signal(SIGCHLD, "sig_handler"); function sig_handler($signo) {switch ($signo) {case SIGCHLD:$status 0;$child_id pcntl_wait($statu…

Oracle取最大/最小值函数

SELECT greatest(DATE2020-01-01,DATE2020-01-03,DATE2020-01-05,DATE2020-01-07,DATE2020-01-09) 最大值, least(1,3,5,7,9) 最小值 FROM dual; SELECT 1 FROM dual WHERE greatest(1,3,5,7,9) > 8;

ORACLE将查询字段指定为某种类型

SELECT CAST(张三 AS VARCHAR2(20)) name FROM dual; 一般来说在查询时很少有用到这种语句&#xff0c;但是使用CREATE TABLE ... AS SELECT ...语句的时候这个就很好用了 --建表 CREATE TABLE test01 AS SELECT 张三 name FROM dual; --正常插入数据 INSERT INTO test01 SEL…

Less Css 教程

http://www.w3cplus.com/css/less&#xff0c;这个东西太吊了&#xff01;转载于:https://www.cnblogs.com/wln3344/p/4479014.html

分组查询最晚一条数据(ORACLE)

现有客户表&#xff0c;交费表&#xff0c;需查询每个存在交费记录客户的最后一笔交费信息 这里提供两种方式 注&#xff1a;客户不会在同一时间有两条交费&#xff0c;SQL可直接执行 --查询客户名称&#xff0c;最后一笔交费时间&#xff0c;以及最后一笔交费金额 WITH --客…

ORACLE循环中使用序列

在批量生成数据时&#xff0c;经常会用到序列的Nextval&#xff0c;今天碰到了这样的情况&#xff0c;日常记录&#xff0c;下附解决方案。先看这段脚本 DECLARE i INTEGER; BEGINFOR cur IN 1..5 LOOPi : DomainObjectId.Nextval;dbms_output.put_line(i);END LOOP; END; 编…

常用的机器学习数据挖掘知识点【转】

转自&#xff1a; 【基础】常用的机器学习&数据挖掘知识点 Basis(基础)&#xff1a; MSE(Mean Square Error 均方误差)&#xff0c;LMS(LeastMean Square 最小均方)&#xff0c;LSM(Least Square Methods 最小二乘法)&#xff0c;MLE(MaximumLikelihood Estimation最大似然…

tomcat运行问题解决方法

早上过来遇到一个非常奇怪的问题&#xff0c;运行一个新的项目&#xff0c;运行环境都没问题&#xff0c;可是在调试的时候&#xff0c;总是出错。 错误代码&#xff1a; log4j:WARN No appenders could be found for logger log4j:WARN Please initialize the log4j system p…

团队开发——冲刺1.d

冲刺阶段一&#xff08;第四天&#xff09; 1、昨天做了什么&#xff1f; 完成部分界面设置&#xff0c;补充三层难度界面、游戏结束界面。 2、今天准备做什么&#xff1f; 优化界面细节。查看C#资料&#xff0c;再解决自己电脑的问题。 3、遇到什么困难&#xff1f; 已经固定好…

10. javacript高级程序设计-DOM

1. DOM DOM(文档对象模型)是针对HTML和XML文档的一个API&#xff08;应用程序接口&#xff09; 1.1 节点层次 DOM可以将任何HTML和XML文档描绘成一个由多层节点构成的结构。节点分为几种不同的类型&#xff0c;每种类型分别表示文档中不同的信息及标记。 1.1.1 Node类型 DOM1中…

hdu 5045 Contest(状态压缩DP)

题解&#xff1a;我们使用一个二位数组dp[i][j]记录进行到第i个任务时&#xff0c;人组合为j时的最大和&#xff08;这里的j我们用二进制的每位相应一个人&#xff09;。 详细见代码&#xff1a; #include <iostream> #include <cstdio> #include <cstring> …

mysql001创建数据库

-- 注释&#xff0c;ctrl/ -- 查询所有数据库&#xff1b; show DATABASES; -- 创建数据库; CREATE DATABASE studb; -- 切换数据库; USE studb; -- 删除数据库 DROP DATABASE studb;

mysql002创建表

-- 创建student表 DDL CREATE TABLE stdent( sno int(3), name VARCHAR(55), sex CHAR(2), age int, dtdate date, classname VARCHAR(55), email VARCHAR(55) ) -- 查询表中数据 DQL SELECT * FROM stdent;

oc基础-self关键字的使用

#import <Foundation/Foundation.h>interface Student : NSObject {int _age;char *_name; } - (void) study; - (void) run; (void) play;(void) run; endimplementation Student - (void) study {NSLog("%s在学习",self->_name);[self run];//若在此调用…

mysql003操作表DDL

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 在表中添加一列 DDL -- 新增列 默认添加到最后 ALTER TABLE stdent add score DOUBLE(4,1); -- 新增一列 在表中开头添加 ALTER TABLE stdent add score2 double(5,1) first; -- 在指定列后面添…

Google Guava学习笔记——基础工具类Joiner的使用

Guava 中有一些基础的工具类&#xff0c;如下所列&#xff1a; 1&#xff0c;Joiner 类&#xff1a;根据给定的分隔符把字符串连接到一起。MapJoiner 执行相同的操作&#xff0c;但是针对 Map 的 key 和 value。 2&#xff0c;Splitter 类&#xff1a;与 Joiner 操作相反的类&a…

xampp 无法启动mysql

Error: could not open single-table tablespace file .\test\dr.ibd 在网上搜索到的解决方案都不管用。结果整合了两个解决方案&#xff1a; 删掉xampp/data/ib_logfile0 xampp/data/ib_logfile1 xampp/data/ibdata1 三个文件就好了转载于:https://www.cnblogs.com/fyydnz/p/4…

mysql005约束.列级别

-- 列级约束 -- sno 主键&#xff1a;唯一&#xff0c;不为空&#xff0c;自增 -- name 非空 -- sex 非空&#xff0c;默认值&#xff0c;只有男女 -- age 0-30岁 -- score 非空 -- dtdate 非空 -- classname 非空 -- email唯一 -- 创建表&#xff0c;增加列级约束 …