对从Registry中读取数据感到困惑

时间:2015-01-14 16:05:42

标签: java

我试图从注册表中获取一些数据。问题是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;

2 个答案:

答案 0 :(得分:2)

考虑使用jna提供注册表处理实用程序的Java Native Access库。

我建议使用不同的工具包而不是简单地解决问题的原因与一些项目有关。启动外部可执行文件时,必须以缓冲方式处理输入和输出,并且有两个输出流(正常和错误)。

简而言之,通常所有这些输入和输出流可能都需要可用,但是当典型开发环境中不存在故障时,您通常不会注意到故障。后来,在生产环境(无头,无控制台等)中,这些问题变得明显。

要通过CLI调用解决这些问题,您通常会设置缓冲区收集器以捕获独立线程中的输出,有时您需要站起来一个假缓冲区提供程序(某些程序检查输入是否可读,即使它们是不读任何输入!)。 JNA库使用JNI,它通过侧面执行包装可执行调用的CMD shell来大大减少问题。

但是,如果您只想了解代码中的逻辑错误,那么JimW会很好地解释它。

答案 1 :(得分:1)

您正在用您从reader.readLine()读取的内容替换行的内容,当最终返回null时,您返回的行当然是null。

而是在开始循环之前创建一个StringBuilder并追加到它。

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

如果你想删除结束行,你也可以在附加内部使用.trim()。