在Windows中使用Java查找特定的注册表键

5
我可以在Windows中打开注册表,然后转到 编辑->查找 并输入我想要查找的键(在我的情况下是Maxima),并定位所需的键(在我的情况下在“HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Maxima-5.17.1_is1”中)。 但是,我需要在Java中动态执行此操作,并查找安装的Maxima的当前版本及其在Windows中的目录位置。 我不知道该如何继续。
我尝试使用此处列出的方法:read/write to Windows Registry using Java,但是要使用这些方法,我需要知道该键。 在Java中如何动态查找键? 或者,是否有其他方法可以在Windows中使用Java查找软件的版本和目录位置?

我尝试了那里提到的方法,但是“要使用这些方法,我需要知道密钥”。 - Riyafa Abdul Hameed
使用 hKey=WinRegistry.HKEY_LOCAL_MACHINEkey="SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\Uninstall\\Maxima-5.17.1_is1"。注册表键是一个简单的字符串,包含 HKEY_xxx 之后的所有内容。因此,设置动态键来包含一些 Maxima 版本信息不应该有问题。 - Lukas Thomsen
我该如何动态地找到密钥而不是硬编码呢?我的意思是,在这种情况下,我不得不去RegEdit并搜索maxima以找到它的位置。我想在Java中完成这个过程,而不是手动去RegEdit。 - Riyafa Abdul Hameed
2个回答

4
我会使用这个类来回答您的问题,因为它是用纯Java代码编写的。

  1. 这里获取一个WinRegistry类。
  2. 获取父键中所有键的列表。
  3. 过滤列表以获取最合适的键(或确切的键)。
  4. 然后你可以在该键中检查你想要的值。

这是帮助您的代码:

List<String> ls = WinRegistry.readStringSubKeys(WinRegistry.HKEY_LOCAL_MACHINE,
    "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
String key = ls.stream().filter(st -> st.matches("Maxima.*")).findAny().get();

现在这个key值将是Maxima-5.17.1_is1(如果存在,否则会抛出java.util.NoSuchElementException异常)。您可以使用它来获取任何Value

请记住,访问私有方法可能最终会导致错误。在面向对象的API(如Java SE)中,公共方法永远不会改变,但私有方法是可以在任何未来版本中更改的实现细节。 - VGR

4

我建议避免强制访问私有方法,因为:

  1. 它们在Java的未来版本中可能不存在。下一个小更新可能没有这些方法。
  2. 如果代码只能在没有SecurityManager的情况下工作,则代码的可移植性较差。

如果使用 reg.exe,则您的代码保证可以在所有Java版本中工作,至少在微软将reg.exe与Windows捆绑的时间内是如此。

ProcessBuilder builder = new ProcessBuilder("reg", "query",
    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
Process reg = builder.start();
try (BufferedReader output = new BufferedReader(
    new InputStreamReader(reg.getInputStream()))) {

    Stream<String> keys = output.lines().filter(l -> !l.isEmpty());
    Stream<String> matches = keys.filter(l -> l.contains("\\Maxima"));
    Optional<String> key = matches.findFirst();
    // Use key ... 
}
reg.waitFor();

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