2015-01-14 27 views
1

我想從註冊表中獲取一些數據。問題在於while循環,因爲當應用程序在調試模式下運行時,我可以查看行變量的值。但是循環行的結尾變量賦值爲null困惑於從註冊表中讀取數據

private final String DESKTOP_PATH="\"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" 
      + "CurrentVersion\\Explorer\\Shell Folders\" /v Desktop"; 

    private final String REG="REG_SZ"; 

    private final String EXACUTE_STR="reg query "+DESKTOP_PATH; 
     private String getDesktopPath() throws IOException { 
     Process p = null; 
     String line = null; 
     try { 
      p = Runtime.getRuntime().exec(EXACUTE_STR); 
      p.waitFor(); 
      InputStream stream=p.getInputStream(); 


      BufferedReader reader=new BufferedReader(new InputStreamReader(stream)); 


      while((line=reader.readLine())!=null){ 
       line+=reader.readLine(); 

      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return line; 

回答

1

你與你reader.readLine讀什麼替代行的內容(),當最終返回null返回行這當然是空的。

取而代之的是在啓動循環之前創建一個StringBuilder。

StringBuilder buffer = new StringBuilder(); 
while ((line = reader.readLine())!=null) { 
    buffer.append(line); 
} 
// buffer.toString() is the String you are looking for 

如果你想刪除結束行,你也可以在append中添加.trim()。

+0

謝謝你吉姆你是對的 – user3733078

2

考慮使用jna提供註冊表處理實用程序的Java本機訪問庫。

我推薦一個不同的工具包,而不是簡單地解決你的問題的原因與一些項目有關。啓動外部可執行文件時,必須以緩衝方式處理輸入和輸出,並且有兩個輸出流(正常和錯誤)。

總而言之,通常所有這些輸入和輸出流都可能需要可用,但是當典型開發環境中不存在時,您通常不會注意到失敗。後來,在生產環境中(無頭,無控制檯等),這些問題變得明顯。

爲了通過CLI調用來解決這些問題,您通常會設置緩衝收集器來捕獲獨立線程中的輸出,有時您需要站起來假冒緩衝區提供程序(某些程序檢查輸入是否可讀,即使他們不讀任何輸入!)。 JNA庫使用JNI,通過側置包裝可執行調用的CMD shell可以大大減少問題。但是,如果您只想知道代碼中的邏輯錯誤,JimW就很好地解釋了它。