在Windows中使用java查找特定的registry项

我可以去窗户regedit,然后去编辑 – >find并键入我想在我的电脑(在我的情况下,最大值)find的密钥,并find所需的密钥(的最大值)(在我的情况下,它是在“HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ Maxima-5.17.1_is1“),但我需要在java中dynamic地执行此操作,并在Windows中查找当前安装的maxima版本及其目录位置。 我不知道如何进行。

我试图使用这里陈述的方法: 读/写使用Java的Windowsregistry ,但要使用这些方法,我需要知道的关键。 如何在Java中dynamic地find密钥? 或者有没有其他的方法来find在Windows中使用Java的软件的版本和目录位置?

我将用这个类来解答你的答案。 因为它是用纯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(); 

现在这个keyMaxima-5.17.1_is1 (如果存在的话,否则java.util.NoSuchElementException将被抛出)。 你可以用它来获得任何价值

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

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

如果您使用reg.exe ,那么您的代码可以保证在所有版本的Java中都能正常工作,至少只要Microsoft在Windows中包含reg.exe即可:

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