Java:读取Windows注册表键已停止工作

3

我一直通过执行 "reg query" 来读取键和值,但几天前它停止了工作。 我没有更改任何代码。 读取键值仍然正常工作:

        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命令行运行查询,它可以正常工作,所以我的查询并没有错误...我已经将小程序运行在服务器上,但是两天前我们的外部测试人员报告说该小程序正在冻结。然而,对于我和我的同事来说,它仍然在工作。但今天早上它也冻结了,并且从那时起就无法工作了...


这几天发生了什么事情吗?浏览器更新、操作系统更新、安装了补丁程序?可能是从您的防病毒软件到操作系统补丁再到浏览器更新的任何事情。 - Ali
1个回答

4
通常情况下,waitFor()调用失败是因为子进程被阻塞在写操作上。
由于在运行reg命令时没有读取其输出内容,可能会导致它填充了输出缓冲区,并在等待您读取一些输出内容后才继续写入。
例如,如果向注册表键添加更多值,则可能会破坏之前正常运行的查询。
我建议创建一个线程用于读取进程的标准输出流,另一个用于读取其标准错误流。当您读取完所有输出内容时,标准输出流将发出EOF信号(这将使您的BufferedReader返回null)。
此时,调用waitFor()不应该阻塞(这在一般情况下并不安全,但对于reg命令来说是可以的)。最后,您应该destroy()进程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接