2015-01-14 28 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就很好地解释了它。