java - 无法在 Windows 10 中编写 Java 首选项
问题描述
我正在尝试运行一个程序来Java
查找Windows 10
使用JDK 10.0.2
. 如果它在系统节点下找到它们,它会尝试将它们复制到用户自己的节点,然后用户可以根据自己的喜好更改它们。我在阅读或写作偏好方面都没有运气。我在版本 8 上尝试了几个不同的 JDK,然后安装了 10,理论上它可能会更好,但事实并非如此。
我的程序是我几年前写的一个老游戏。上次我在 2012 年运行它时它运行良好。(那时,我可能正在运行JDK 6
。Windows XP
)
我在另一个 StackOverflow 讨论中发现了一些使用首选项的代码,这比我自己的要简单得多,对其进行了一些修改,并尝试运行它以查看是否可以提出一个易于重现的示例:
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
public class Prefs01 {
public static void main( final String[] args ) throws BackingStoreException {
Preferences systemRoot = Preferences.systemRoot();
Preferences preferences = systemRoot.node("fuzz");
systemRoot.put( "foo", "bar" );
systemRoot.put( "baz", "lolz" );
System.out.println( "-------------------------------" );
String[] keys = preferences.keys();
for( String key : keys ) {
System.out.println( key );
}
System.out.println( "-------------------------------" );
keys = systemRoot.keys();
for( String key : keys ) {
System.out.println( key );
}
}
}
结果
Preferences systemRoot = Preferences.systemRoot();
调试器显示此语句后systemRoot为“/”;到目前为止没有错误。
Preferences preferences = systemRoot.node("fuzz");
控制台产生此消息:
Oct 01, 2018 5:05:24 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not create windows registry node Software\JavaSoft\Prefs\fuzz at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
systemRoot.put( "foo", "bar" );
控制台生成此消息和堆栈跟踪:
2018 年 10 月 1 日下午 5:09:38 java.util.prefs.WindowsPreferences openKey 警告:无法在根 0x80000002 处打开 Windows 注册表节点 Software\JavaSoft\Prefs。Windows RegOpenKey(...) 返回错误代码 5。线程“主”java.lang.SecurityException 中的异常:无法在根 0x80000002 处打开 Windows 注册表节点 Software\JavaSoft\Prefs:在 java.prefs/java.util 处拒绝访问。 prefs.WindowsPreferences.openKey(WindowsPreferences.java:553) 在 java.prefs/java.util.prefs.WindowsPreferences.openKey(WindowsPreferences.java:515) 在 java.prefs/java.util.prefs.WindowsPreferences.openKey(WindowsPreferences. java:501) 在 java.prefs/java.util.prefs.WindowsPreferences.putSpi(WindowsPreferences.java:652) 在 java.prefs/java.util.prefs.AbstractPreferences.put(AbstractPreferences.java:263) 在 Prefs01.main (首选项01。
根据我收到的错误消息,我的印象是我有某种 Windows 授权问题:我无权在 Windows 注册表中做我想做的事情。这对我来说毫无意义,因为UAC
这台机器上只有一个,而且是管理员;UAC
即使机器上有另一个程序,我也不知道有什么方法可以在不同的程序下运行这个程序UAC
。
谁能阐明这里出了什么问题以及我需要做些什么来解决它?
解决方案
正如一些评论者所说,运行“以管理员身份”可能会解决问题。
但是,此错误和代码中给出了问题的根本原因:
Preferences systemRoot = Preferences.systemRoot();
...
WARNING: Could not open windows registry node Software\JavaSoft\Prefs at root 0x80000002
在当前的 JDK 实现中,systemRoot
等价于HKEY_LOCAL_MACHINE
(as is 0x80000002
)。默认情况下,用户在不通过 UAC 的情况下没有写入权限。
要解决此问题,您最好将代码更改为 use Preferences.userRoot()
,该代码访问 下的注册表节点HKEY_CURRENT_USER
,这通常是可写的。
推荐阅读
- javascript - 有没有办法在 datalist 元素中呈现可点击的选项标签?
- r - 在R中将数据框拆分为一定数量的组
- bash - 在bash中转换日期格式
- html - 如何将背景图像(png 图像格式)添加到具有伪元素 ::before 的 div
- amazon-web-services - AWS 系统管理器 + CodeDeploy + Lightsail
- java - 使用模式匹配 instanceof 和 switch 表达式的 Gradle Java 编译错误
- drupal - 将一个类型的内容引用到另一个常量类型
- unit-testing - EFCore xunit 断言 .Include 是否被调用
- python - “未找到 Python,但可以从 Microsoft 商店安装”
- linux - 如何使用sed将双引号保留在双引号中