Java: 操作读写注册表
在IntelliJ IDEA中新建Maven项目:
在Maven中引入 JNA(Java Native Access)依赖。
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.5.0</version>
</dependency>
编写 RegistryUtil 工具类:
import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.WinReg;
import sun.encryption.constants.Constants;
public class RegistryUtil {
/**
* 向指定目录下的keyPath中, 写入key-value
* 当 HKEY不同时, 可能会出现 "拒绝访问" 的问题, 此时需要手动打开注册表, 修改对应的keyPath父级目录(此处为SOFTWARE)的全部读写权限
* @param value
*/
public static boolean writeToRegistry(String key, String value) {
// 判断KeyPath是否存在
boolean isOkay = Advapi32Util.registryKeyExists(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\keyPath");
// 若不存在
if (!isOkay) {
try {
// 创建keyPath(即, 目录)
Advapi32Util.registryCreateKey(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\你要添加的keyPath");
} catch (Exception e) {
// 遇到异常, 写入失败
return false;
}
}
try {
// 向指定目录下的KeyPath中, 写入key及其value
Advapi32Util.registrySetStringValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\你要添加的keyPath", "key", "value");
} catch (Exception e) {
// 遇到异常, 写入失败
return false;
}
// 写入成功
return true;
}
// 删除注册表中的keyPath及旗下key-value对
public static boolean deleteRegistryKey(String keyPath) {
try {
// Delete a key
Advapi32Util.registryDeleteKey(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\keyPath");
} catch (Exception e) {
// 删除失败
return false;
}
// 删除成功
return true;
}
// 从注册表中读取key对应的value值
public static String readKeyFromRegistry(String key) {
String value;
try {
// 根据 key(value所在目录) 返回注册表中类型为 REG_SZ 的 value 对应的值
value = Advapi32Util.registryGetStringValue(
WinReg.HKEY_LOCAL_MACHINE, Constants.KEY_PATH, key);
} catch (Exception e) { // 对应key不存在
value = null;
}
return value;
}
public static void main(String[] args) {
boolean isOk;
isOk = writeToRegistry("sun", "123");
System.out.println("写入" + isOk);
String value = readKeyFromRegistry("sun");
System.out.println(value);
isOk = deleteRegistryKey(Constants.KEY_PATH);
System.out.println("删除" + isOk);
}
}
此处需要注意的是,当创建主键(CreateKey)
Advapi32Util.registryCreateKey(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\keyPath");
执行时,可能会报 拒绝访问 错误。
解决方法是,打开注册表 (regedit):
找到对应目录 HKEY_LOCAL_MACHINE
→
\rightarrow
→ SOFTWARE
对 HKEY_LOCAL_MACHINE 以及 SOFTWARE 进行权限修改,将所有用户的权限全部改为 可读写 。
将所有组或用户名的权限修改为完全控制+读取,即可解决问题!