2011-06-13 70 views
1

可能重複:
read/write to Windows Registry using Java如何使用java讀取註冊表值?

我想讀的路徑HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CurrentVersion\Uninstall\{2FC099BD-AC9B-33EB-809C-D332E1B27C40}的註冊表值。

你能幫我解碼嗎?

+4

[讀/寫Windows註冊表使用Java(http://stackoverflow.com/questions/62289/使用Java/1982033#1982033) – 2011-06-13 07:07:16

+0

嗨...這段代碼正在工作,但你能幫我理解這段代碼,因爲我是新來的java。我不明白爲什麼StreamReader是從Thread擴展而來的。 – amod 2011-06-14 09:48:04

回答

4

這顯示瞭如何讀取註冊表,但可以擴展到寫操作:How to read the Windows Registry

import java.io.*; 

public class RegQuery { 

    private static final String REGQUERY_UTIL = "reg query "; 
    private static final String REGSTR_TOKEN = "REG_SZ"; 
    private static final String REGDWORD_TOKEN = "REG_DWORD"; 

    private static final String PERSONAL_FOLDER_CMD = REGQUERY_UTIL + 
    "\"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\" 
    + "Explorer\\Shell Folders\" /v Personal"; 
    private static final String CPU_SPEED_CMD = REGQUERY_UTIL + 
    "\"HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\"" 
    + " /v ~MHz"; 
    private static final String CPU_NAME_CMD = REGQUERY_UTIL + 
    "\"HKLM\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\"" 
    + " /v ProcessorNameString"; 

    public static String getCurrentUserPersonalFolderPath() { 
    try { 
     Process process = Runtime.getRuntime().exec(PERSONAL_FOLDER_CMD); 
     StreamReader reader = new StreamReader(process.getInputStream()); 

     reader.start(); 
     process.waitFor(); 
     reader.join(); 

     String result = reader.getResult(); 
     int p = result.indexOf(REGSTR_TOKEN); 

     if (p == -1) 
     return null; 

     return result.substring(p + REGSTR_TOKEN.length()).trim(); 
    } 
    catch (Exception e) { 
     return null; 
    } 
    } 

    public static String getCPUSpeed() { 
    try { 
     Process process = Runtime.getRuntime().exec(CPU_SPEED_CMD); 
     StreamReader reader = new StreamReader(process.getInputStream()); 

     reader.start(); 
     process.waitFor(); 
     reader.join(); 

     String result = reader.getResult(); 
     int p = result.indexOf(REGDWORD_TOKEN); 

     if (p == -1) 
     return null; 

     // CPU speed in Mhz (minus 1) in HEX notation, convert it to DEC 
     String temp = result.substring(p + REGDWORD_TOKEN.length()).trim(); 
     return Integer.toString 
      ((Integer.parseInt(temp.substring("0x".length()), 16) + 1)); 
    } 
    catch (Exception e) { 
     return null; 
    } 
    } 

    public static String getCPUName() { 
    try { 
     Process process = Runtime.getRuntime().exec(CPU_NAME_CMD); 
     StreamReader reader = new StreamReader(process.getInputStream()); 

     reader.start(); 
     process.waitFor(); 
     reader.join(); 

     String result = reader.getResult(); 
     int p = result.indexOf(REGSTR_TOKEN); 

     if (p == -1) 
     return null; 

     return result.substring(p + REGSTR_TOKEN.length()).trim(); 
    } 
    catch (Exception e) { 
     return null; 
    } 
    } 

    static class StreamReader extends Thread { 
    private InputStream is; 
    private StringWriter sw; 

    StreamReader(InputStream is) { 
     this.is = is; 
     sw = new StringWriter(); 
    } 

    public void run() { 
     try { 
     int c; 
     while ((c = is.read()) != -1) 
      sw.write(c); 
     } 
     catch (IOException e) { ; } 
     } 

    String getResult() { 
     return sw.toString(); 
    } 
    } 

    public static void main(String s[]) { 
    System.out.println("Personal directory : " 
     + getCurrentUserPersonalFolderPath()); 
    System.out.println("CPU Name : " + getCPUName()); 
    System.out.println("CPU Speed : " + getCPUSpeed() + " Mhz"); 
    } 
} 
+0

嗨...這段代碼工作,但你可以幫助我理解這段代碼,因爲我是新來的java。我不明白爲什麼StreamReader是從Thread擴展而來的 – amod 2011-06-14 09:55:56

1

有一個tutorial顯示你沒有使用Runtime.exec()函數和具體使用java.util.prefs.WindowsPreferences