2011-09-07 68 views
2

我一直在閱讀鍵和值通過執行「reg查詢」,但幾天前它停止工作。我沒有改變任何代碼。 讀一個鍵值仍然正常工作:Java:閱讀Windows註冊表鍵停止工作

 Process process = Runtime.getRuntime().exec(
       "reg query " + "\"" + root + key + "\" /v " + valueName); 
     InputStreamReader inputreader = new InputStreamReader(
       process.getInputStream()); 
     BufferedReader reader = new BufferedReader(inputreader); 
     process.waitFor(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      if (line.contains("REG_SZ")) { 
       Pattern pattern = Pattern.compile("REG_SZ\\s*(.*)"); 
       Matcher matcher = pattern.matcher(line); 
       while (matcher.find()) { 
        return line.substring(matcher.start(1)); 
       } 
      } else if (line.contains("REG_DWORD")) { 
       Pattern pattern = Pattern.compile("REG_DWORD\\s*(.*)"); 
       Matcher matcher = pattern.matcher(line); 
       while (matcher.find()) { 
        return line.substring(matcher.start(1)); 
       } 
      } 
     } 

但process.waitFor(讀取密鑰時)永遠不會返回。這工作,直到前幾天:

 Process process = Runtime.getRuntime().exec(
       "reg query " + "\"" + root + key + "\""); 
     InputStreamReader inputreader = new InputStreamReader(
       process.getInputStream()); 
     BufferedReader reader = new BufferedReader(inputreader); 
     process.waitFor(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      System.out.println(">>"+line); 
      if (line.contains(root)) { 
       list.add(line.substring(line.lastIndexOf('\\') + 1)); 
      } 
     } 
     String[] keys = new String[list.size()]; 
     return list.toArray(keys); 

如果我運行使用Windows命令行,它工作正常的查詢,所以我有一個服務器上運行的小程序這不是我的查詢這是錯誤的...... ,但兩天前,我們的外部測試人員報告說,這個小程序是凍結的。但它仍然爲我和我的同事工作。今天早上它也凍結了我也一直沒有工作,因爲...

+0

這幾天發生了什麼?瀏覽器更新,操作系統更新,補丁安裝?可能是從反病毒到操作系統補丁到瀏覽器更新的任何內容。 – Ali

回答

4

通常,waitFor()調用無法返回,因爲子進程在寫入時被阻止。

由於您在運行時沒有使用reg命令的輸出,它可能已經填充了輸出緩衝區,並且它正在等待您在寫入更多內容之前讀取一些輸出。

例如,如果將更多值添加到註冊表項中,則可能會破壞以前工作的查詢。

我推薦創建一個線程來讀取進程的標準輸出流,另一個線程讀取它的標準錯誤流。當您讀取所有輸出時,標準輸出流將發出EOF信號(這會導致您的BufferedReader返回null)。

此時,不應阻止對waitFor()的呼叫(這通常不是一個安全的假設,但對於reg命令可以)。最後,你應該是destroy()的過程。