2015-07-05 24 views
2

我可以去windows註冊表編輯器,然後找到並鍵入我想在我的電腦中找到的鍵(在我的情況下是Maxima)並找到所需的鍵(在我的情況下它是在「HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ Maxima-5.17.1_is1」) 但我需要在java中動態地執行此操作,並找到當前版本的maxima安裝及其在Windows中的目錄位置。我不知道如何繼續。在窗口中使用java找到一個特定的註冊表鍵

我試圖使用這裏陳述的方法:read/write to Windows Registry using Java,但要使用這些方法我需要知道的關鍵。我如何在java中動態地找到密鑰?或者有沒有其他方法可以在使用java的窗口中查找軟件的版本和目錄位置?

+0

的可能重複[讀/寫到Windows註冊使用Java](http://stackoverflow.com/questions/62289/read-write-to-windows-registry-using-java) –

+0

不重複。我嘗試了那裏提到的方法,但「使用這些方法我需要知道密鑰」 –

+0

使用'hKey = WinRegistry.HKEY_LOCAL_MACHINE'和'key =「SOFTWARE \\ Wow6432Node \\ Microsoft \\ Windows \\ CurrentVersion \ Uninstall \\千里馬-5.17.1_is1" '。註冊表項是一個簡單的字符串,包含'HKEY_xxx'後面的所有內容。因此,動態設置包含最大值的某些版本信息的密鑰應該沒有問題。 –

回答

4

我將使用this類爲您的答案。因爲它是用純Java代碼編寫的。

  1. here有一個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將被拋出)。你可以用它來獲得任何價值

+0

感謝它的工作 –

+0

請記住,訪問私有方法最終可能會中斷。在面向對象的API(如Java SE)中,公共方法永遠不會改變,但私有方法是可以在將來的任何版本中更改的實現細節。 – VGR

1

我會避免強制訪問私有方法,這是因爲:

  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(); 
相關問題