Java: 操作读写注册表(Registry)

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 进行权限修改,将所有用户的权限全部改为 可读写
在这里插入图片描述

将所有组或用户名的权限修改为完全控制+读取,即可解决问题!

在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值