??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区精品久久,亚洲精品中文字幕有码专区,久久久www免费人成精品 http://www.aygfsteel.com/jimmy/category/34743.htmlzh-cnSat, 20 Sep 2008 03:58:24 GMTSat, 20 Sep 2008 03:58:24 GMT60java ?注册表操作篇http://www.aygfsteel.com/jimmy/archive/2008/09/20/230097.html牛X书记牛X书记Sat, 20 Sep 2008 02:32:00 GMThttp://www.aygfsteel.com/jimmy/archive/2008/09/20/230097.htmlhttp://www.aygfsteel.com/jimmy/comments/230097.htmlhttp://www.aygfsteel.com/jimmy/archive/2008/09/20/230097.html#Feedback0http://www.aygfsteel.com/jimmy/comments/commentRss/230097.htmlhttp://www.aygfsteel.com/jimmy/services/trackbacks/230097.html使用Preferences API    参考资?/font>

        Preferences的误?/strong>Q?br />          首先要指明的是:(x)Preferences APIq不是ؓ(f)讉KWindows注册表而设计的?br />
        我们之所以会(x)有上面的误解是由于Sun的Windows版本的JDK在实现Preferences API时用了(jin)Windows注册表作为存储库Q即我们用Preferences API存储的数据会(x)保存到Windows注册表中Q这样Preferenes API也就有了(jin)讉KWindows注册表的能力。但是换到其它的q_或其它厂商的JDK实现又会(x)怎么样呢Q这个问题是和Preferences API的实现相关的Q我们没有办法回{?br />
        Preferences适用的条?/strong>Q?br />               如果E序不关?j)存储库的细节,只是要找一个存放数据的地方Q那么Preferences API很合适?br />
        Preferences API的局限:(x)
        一个Java软gQ这ơ我在Sun的JDK上运行ƈ使用Preferences API保存?sh)(jin)我的个人喜好,下次我在IBM的JDK上运行,q时我的个h喜好q可以通过Preferences API得到吗?可能可以也可能不可以Q这时的行ؓ(f)是由Sun和IBM的Preferences API实现军_的。(在相同的JDK实现上可以用Preferences API来在不同的程序间׃n数据Q?/font>
        一个Java软g需要让用户讄是否和操作系l一起启动,cM的需求还很多。这c需求就是要求JavaE序有真正的和相x(chng)作系l协同的能力。这U能力不是Preferences API的设计目标?/font>

使用JNI    参考资?/font>
        Windows操作pȝ提供?jin)操作注册表的APIQ因此用JNIJava和这些APIq接h我们p得了(jin)用Java操作注册表的能力。这说v来有些简单,实现h却需要处理大量的l节。幸q的是这L(fng)工作已经有h做了(jin)Q我们要感谢他们。下面我们就来看看其中的一个包?br />
         com.ice.jni.registry包是通过JNI(Java native interface)实现的Windows注册表操作APIQ可以用来访问、修改和导出Windows注册表。现在这个包已经公开?jin),可以攑ֿ?j)的用而不必担?j)license的问题,q且包括一个构建好的DLL和Java、C的源代码。它可以在Java 1.1和更高的版本上工作?br />


下面详细的描qC下这个包中的c,数量不是很多Q?/font>

  • HexNumberFormat 用来格式化和分析十六q制整数?/font>
  • RegBinaryValue 表示cd为REG_BINARY的注册表倹{REG_BINARY是指L形式的二q制数?/font>
  • RegDWordValue 表示cd为REG_DWORD的注册表倹{REG_DWORD是指一?2位的整数。根据该整数的字节序不同又分为REG_DWORD_LITTLE_ENDIAN和REG_DWORD_BIG_ENDIAN。在Windows中REG_DWORD和REG_DWORD_LITTLE_ENDIAN有相同的含义?/font>
  • RegistryValue 表示Lcd的注册表|q是一个抽象类Q不能被实例化?/font>
  • RegMultiStringValue 表示cd为REG_MULTI_SZ的注册表倹{REG_MULTI_SZ是一个null-terminated的字W串的序列?/font>
  • RegStringValue 表示cd为REG_SZ和REG_EXPAND_SZ的注册表倹{REG_SZ是指一个null-terminated的字W串QREG_EXPAND_SZ是指一个含有未展开的环境变量的null-terminated的字W串?/font>
  • Registry q个cd义了(jin)定?Key)Q包括HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、HKEY_CURRENT_USER、HKEY_DYN_DATA、HKEY_LOCAL_MACHINE、HKEY_PERFORMANCE_DATA和HKEY_USERS。还定义?jin)错误代码,q些错误代码?x)包含在RegistryException中。最后是一些工h法,如dumpHexData、exportRegistryKey、getErrorMessage、getTopLevelKey、openSubkey、parseArgumentString、parseArgumentVector、splitString和usage?/font>
  • RegistryKey 定义?jin)注册表的一个表?Key)和相关的一些操作?/font>

RegistryKey的方法概要:(x)

Ҏ(gu) 短描q?/font>
void closeKey() 关闭该subkey?/font>
RegistryKey connectRegistry(java.lang.String hostName) q接q程LhostName的注册表?/font>
RegistryKey createSubKey(java.lang.String subkey, java.lang.String className) 创徏和打开该key的subkeyQ具有写权限?/font>
RegistryKey createSubKey(java.lang.String subKey, java.lang.String className, int access) 创徏和打开该key的subkeyQ具有指定的权限?/font>
int decrDoubleWord(java.lang.String valueName) 该方法将消减REG_DWORD的倹{?/font>
void deleteSubKey(java.lang.String subKey) 删除该subkey?/font>
void deleteValue(java.lang.String valueName) 删除一个命名的倹{?/font>
static java.lang.String expandEnvStrings(java.lang.String exString) 展开exString中的环境变量?/font>
void export(java.io.PrintWriter out, boolean descend) 导出key?/font>
void finalize() 重蝲?jin)的finalize()Ҏ(gu)Q确保能够关闭key?/font>
void flushKey() 保q个key被写到磁盘,Ҏ(gu)能有一定的影响?/font>
java.lang.String getDefaultValue() 得到该key的默认倹{?/font>
java.lang.String getFullName() 得到key的全名?/font>
int getMaxSubkeyLength() 得到所有subkey名称的最大长度?/font>
int getMaxValueDataLength() 得到所有subkey值的最大长度?/font>
int getMaxValueNameLength() 得到所有值的名称的最大长度?/font>
java.lang.String getName() 得到该key的名U?/font>
int getNumberSubkeys() 得到subkey的数量?/font>
int getNumberValues() 得到值的数量?/font>
java.lang.String getStringValue(java.lang.String valueName) 得到REG_SZ或REG_EXPAND_SZ的倹{?/font>
RegistryValue getValue(java.lang.String valueName) 得到valueName的倹{?/font>
boolean hasDefaultValue() 判断该key是否有默认倹{?/font>
boolean hasOnlyDefaultValue() 判断该key是否只有默认倹{?/font>
int incrDoubleWord(java.lang.String valueName) 该方法将增强REG_DWORD的倹{?/font>
java.util.Enumeration keyElements() 枚D该key的subkey的名U?/font>
RegistryKey openSubKey(java.lang.String subkey) 打开该key的subkeyQ具有写权限?/font>
RegistryKey openSubKey(java.lang.String subKey, int access) 打开该key的subkeyQ具有指定的权限?/font>
java.lang.String regEnumKey(int index) 得到该key在index处的subkey?/font>
java.lang.String regEnumValue(int index) 得到该key在index处的subkey的倹{?/font>
void setCreated(boolean created) 讄该key的created状态?/font>
void setValue(RegistryValue value) 讄该key的倹{?/font>
void setValue(java.lang.String valueName, RegistryValue value) 讄valueName的倹{?/font>
java.util.Enumeration valueElements() 枚D该key的值的名称?/font>
boolean wasCreated() 判断该key是被openedq是被created和opened?/font>



最后我们来看一个代码示例:(x)

package org.solol.test;
import com.ice.jni.registry.NoSuchKeyException;
import com.ice.jni.registry.RegStringValue;
import com.ice.jni.registry.Registry;
import com.ice.jni.registry.RegistryException;
import com.ice.jni.registry.RegistryKey;
/**
* @author solo L
*
*/
public class JNIRegistryTest {
     /**
      * @param args
      */
     public static void main(String[] args) {
       //创徏注册表项q设|相应的?
       try {
         RegistryKey software = Registry.HKEY_LOCAL_MACHINE
           .openSubKey("SOFTWARE");
         RegistryKey subKey = software.createSubKey("SubKeyName", "");
         subKey.setValue(new RegStringValue(subKey, "subKey1",
           "subKey1Value"));
         subKey.setValue(new RegStringValue(subKey, "subKey2",
           "subKey2Value"));
         subKey.closeKey();
       } catch (NoSuchKeyException e) {
         e.printStackTrace();
       } catch (RegistryException e) {
         e.printStackTrace();
       }
                  
       //打开注册表项q读出相应的?
       try {
         RegistryKey software = Registry.HKEY_LOCAL_MACHINE.
           openSubKey("SOFTWARE");
         RegistryKey subKey = software.openSubKey("SubKeyName");
         String subKey1Value = subKey.getStringValue("subKey1");
         String subKey2Value = subKey.getStringValue("subKey2");
         System.out.println(subKey1Value);
         System.out.println(subKey2Value);
         subKey.closeKey();
       } catch (NoSuchKeyException e) {
         e.printStackTrace();
       } catch (RegistryException e) {
         e.printStackTrace();
       }                     
     }
}
创徏的注册表如图所C:(x)

输出l果为:(x)

subKey1Value

subKey2Value



说明Q我的体?#8220;W一步:(x)把下载下来的jar包加载到工程内,W二步,把与jar包在一L(fng)dll文g拯Cjdk安装目录下\jre\bin文g夹下”



牛X书记 2008-09-20 10:32 发表评论
]]>
վ֩ģ壺 | ԰| ƽ| ֹ| | ˮ| ޽| ²| | | | | | | | | | ɽ| | | ʲ| ˮ| | | | ޻| | | | | | ̨| ѽ| | | İ| ߺ| | Ͻ| ƽ| |