首页 > 解决方案 > 无法在 Windows 10 中编写 Java 首选项

问题描述

我正在尝试运行一个程序来Java查找Windows 10使用JDK 10.0.2. 如果它在系统节点下找到它们,它会尝试将它们复制到用户自己的节点,然后用户可以根据自己的喜好更改它们。我在阅读或写作偏好方面都没有运气。我在版本 8 上尝试了几个不同的 JDK,然后安装了 10,理论上它可能会更好,但事实并非如此。

我的程序是我几年前写的一个老游戏。上次我在 2012 年运行它时它运行良好。(那时,我可能正在运行JDK 6Windows 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

谁能阐明这里出了什么问题以及我需要做些什么来解决它?

标签: javawindows-10

解决方案


正如一些评论者所说,运行“以管理员身份”可能会解决问题。

但是,此错误和代码中给出了问题的根本原因:

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,这通常是可写的。


推荐阅读