在Windows 7中,Java偏好设置存储在哪里?

54
我们的一些应用程序中使用Java Preferences,并且由于调用该实用程序的工具相当古老且是在Windows XP时编写的,我们并没有真正注意到这一点。但似乎在Windows 7中不再将Java Preferences存储在注册表中,或者它们被存储在其他地方。
我期望它在以下位置: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs 但我没有在那里看到它。
更奇怪的是,当我运行此应用程序时:
public static void main( final String[] args ) throws BackingStoreException {

    Preferences systemRoot = Preferences.systemRoot();
    Preferences preferences = systemRoot.node( "com/mycompany/settings" );

    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 );
    }
}

实际上它会写入(我可以注释掉然后再运行,这样就能正常工作),但是我在注册表中看不到新的键。

此外,我似乎找不到关于这个的文档。提前感谢。

编辑#1唯一的原因是该设置会随着运行的环境而改变。也就是说,通过手动插入注册表键并进行一些检查,通常会很有用。

我是以管理员身份运行的,但是我没有看到我期望他们在哪里的键。


2
你可以使用Sysinternals Process Monitor来查看该进程的注册表和文件系统操作,并尝试推断读/写操作的位置。 - Sasha Goldshtein
1
为什么要将任何东西存储在HKEY_LOCAL_MACHINE下?我期望它应该存在于HKEY_CURRENT_USER下。此外,你为什么关心这个问题?它没有记录是有原因的:你不应该依赖它,它随时可能会改变。 - Joachim Sauer
顺便问一下,你是以管理员身份运行吗? - bestsss
抱歉,我没有看到你正在使用 systemRoot() 而不是 userRoot() - Joachim Sauer
我会添加编辑以澄清。 - javamonkey79
4个回答

65

它们位于当前用户下:HKEY_CURRENT_USER\Software\JavaSoft\Prefs


你确认过了吗?例如:使用上述代码,然后检查你的注册表?对我来说它在regedit中没有显示出来。 - javamonkey79
2
用户设置位于HKCU下,系统设置位于HCKS下(除非您使用系统变量覆盖它)。但是,在64位Windows上使用32位Java的路径位于WoW64下,就像上面所回答的那样。 - eckes

26

对于 systemRoot:

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\...

对于用户根目录:

HKEY_CURRENT_USER\SOFTWARE\JavaSoft\...

你确认过了吗?例如:使用上面的代码,然后检查你的注册表?对我来说在regedit中没有显示出来。 - javamonkey79
你看看这个?http://msdn.microsoft.com/zh-cn/library/aa965884(v=vs.85).aspx - bestsss
是的,这似乎是一个合理的解释。但是,我也无法在虚拟位置中找到这些密钥。嗯... - javamonkey79

14

我曾在处理systemRoot偏好设置问题时遇到了类似的问题,并通过注册表监视器发现,它们存储的位置取决于Windows操作系统是32位还是64位。

在32位操作系统下(例如我的Windows XP),systemRoot注册表路径为

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs

在64位操作系统下(例如我的Windows 7),systemRoot注册表路径为

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

这两个系统均使用相同的32位JRE(JRE 1.6.0_20-b02)。

当在64位Windows上运行32位应用程序(JVM)时,注册表会自动插入Wow6432Node路径元素,以允许编译为32位或64位的应用程序在同一台计算机上共存,并保持它们的设置分离。


1
在 Windows 7 64 位系统中,我在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft 下没有看到任何偏好设置,但我在 HKEY_CURRENT_USER\Software\JavaSoft\Prefs 中看到了它们。 - sdjuan

1
一些偏好设置存储在注册表键中,而另一些(我现在要检查哪些)似乎存储在文本文件中;例如,“在浏览器密钥库中使用证书和密钥”偏好设置存储在C:\Users\%USER%\AppData\LocalLow\Sun\Java\Deployment\deployment.properties中。
#deployment.properties
#Thu Jun 12 15:26:53 CEST 2014

deployment.security.browser.keystore.use=false

deployment.modified.timestamp=1402579613914
deployment.version=7.21
deployment.browser.path=C\:\\Program Files\\Mozilla Firefox\\firefox.exe
#Java Deployment jre's
#Thu Jun 12 15:26:53 CEST 2014
deployment.javaws.jre.0.registered=true
deployment.javaws.jre.0.platform=1.7
deployment.javaws.jre.0.osname=Windows
deployment.javaws.jre.0.path=C\:\\Program Files\\Java\\jre7\\bin\\javaw.exe
deployment.javaws.jre.0.product=1.7.0_60
deployment.javaws.jre.0.osarch=x86
deployment.javaws.jre.0.location=http\://java.sun.com/products/autodl/j2se
deployment.javaws.jre.0.enabled=true
deployment.javaws.jre.0.args=

这是在Windows 7专业版/32位-JRE 1.7.0_60 (i586)上验证的。
来源:
本网站上相关的问题
Oracle - Java SE文档 - 部署配置文件和属性 祝你有愉快的一天。

2
这很可能是使用java.util.Properties管理的“属性文件”,这是Java 1.0引入的非常基本的API。问题的主题是首选项API,这是Java 1.4引入的更复杂的机制。尽管如此,它们各自都有适用的领域。 - Mario Rossi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接