使用 Java 访问 Windows 注册表(原创)
2005/5/24
使用 Java 访问 Windows 注册表
当然了, 只能运行在 Windows 下面, 可以使用开源的组件(很小, 大概40KB), JRegistryKey released under LGPL at http://www.sf.net/projects/jregistrykey. 这个包内部应该是调用jni完成的(采用jndi也可以访问windows注册表,但是提供访问注册表的具体服务程序,即完成jndi的spi的那部分也应该是采用jni完成的)。
下面是例子:
import ca.beq.util.win32.registry.*;
import java.util.*;
public class RegTest
{
public RegTest()
{
RegistryKey r = new RegistryKey(RootKey.HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders");
System.out.println(r);
if(r.hasValue("Common Desktop")) {
RegistryValue v = r.getValue("Common Desktop");
System.out.println("Common Desktop = " + v.getStringValue());
}
// if(r.hasValues()) {
// Iterator i = r.values();
// while(i.hasNext()) {
// RegistryValue v = (RegistryValue)i.next();
// System.out.println(v.toString());
// } // while
// } // if
}
public static void main(String[] args)
{
RegTest regtest = new RegTest();
}
}
这个程序可以读出来用户桌面所在的位置. 其实还有其他的用途, 例如 CLASSPATH 的设置一直都是让用户打开我得电脑 -> 属性云云, 很麻烦, 可以直接写程序来设置, 如下所示:
import ca.beq.util.win32.registry.*;
import java.io.*;
/**
* Using JRegistryKey released under LGPL at http://www.sf.net/projects/jregistrykey
* to access Windows registry to setup system variables on Win2K, WinXP platform.
* DO NOT RUN THIS PROGRAM OTHERTHAN WINDOWS!
*
* Two variables need to be modified:
* 1. CLASSPATH
* 2. PATH
*
* @author BeanSoft
* @version 0.1
*
*/
public class Win32SystemVariableSetup
{
public Win32SystemVariableSetup()
{
String logText = "";
RegistryKey envReg = new RegistryKey(
RootKey.HKEY_CURRENT_USER, "Environment");
if(envReg.hasValue("CLASSPATH_BACKUP")) {
logText += "It looks that classpath has been setted, not need to setup again!/n";
}
else {
String originalClasspath = "";
if(envReg.hasValue("CLASSPATH")) {
originalClasspath = envReg.getValue("CLASSPATH").getStringValue();
logText += "The original CLASSPATH is:" +
originalClasspath + "/n";
logText += "Now save it to a copy called CLASSPATH_BACKUP/n";
// RegistryKey backClasspathKey = new RegistryKey("CLASSPATH_BACKUP");
RegistryValue backValue= new RegistryValue("CLASSPATH_BACKUP", originalClasspath);
// backClasspathKey.setValue(
envReg.setValue(backValue);
}
// Setup new classpath
String jmfClassPath = ".//lib;.//lib//customizer.jar;.//lib//jmf.jar;.//lib//sound.jar;.//lib//mediaplayer.jar;.//lib//multiplayer.jar;.;";
String beanChatClassPath = ".//classes;.//lib//OfficeLnFs.jar;.//lib//xplookandfeel.jar;.//lib//hsqldb.jar;.//lib//jdbc_conn_pool.jar;";
String newClassPathToSet = beanChatClassPath + jmfClassPath + originalClasspath;
RegistryValue newClasspathValue = new RegistryValue("CLASSPATH", newClassPathToSet);
logText += "New class path need to be setted:/n" + newClassPathToSet + "/n";
envReg.setValue(newClasspathValue);
}
if(envReg.hasValue("PATH_BACKUP")) {
logText += "It looks that path has been setted, not need to setup again!/n";
}
else {
String originalPath = "";
if(envReg.hasValue("PATH")) {
originalPath = envReg.getValue("PATH").getStringValue();
logText += "The original PATH is:" +
originalPath + "/n";
logText += "Now save it to a copy called PATH_BACKUP/n";
// RegistryKey backClasspathKey = new RegistryKey("CLASSPATH_BACKUP");
RegistryValue backValue= new RegistryValue("PATH_BACKUP", originalPath);
// backClasspathKey.setValue(
envReg.setValue(backValue);
}
// Setup new classpath
String jmfPath = ".//lib;.//JMF_win32//lib;.;";
String newPathToSet = jmfPath + originalPath;
RegistryValue newPathValue = new RegistryValue("PATH", newPathToSet);
logText += "New path need to be setted:/n" + newPathToSet + "/n";
envReg.setValue(newPathValue);
}
logText += "To make affect of the registry work, please log off and log on again or just reboot your computer.";
javax.swing.JOptionPane.showMessageDialog(null, new java.awt.TextArea(
logText));
System.exit(0);
}
public static void main(String[] args)
{
Win32SystemVariableSetup win32systemvariablesetup = new Win32SystemVariableSetup();
}
}