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

时间:2011-09-07 20:31:34

标签: java applet registry

我一直在通过执行“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命令行运行查询它工作正常,所以这不是我的查询错误... 我在服务器上运行applet,但是两天前我们的外部测试人员报告说applet很冷。然而,它仍然为我和我的同事工作。今天早上它也为我冻结了,从那以后它就没有用了......

1 个答案:

答案 0 :(得分:4)

通常,waitFor()调用无法返回,因为子进程在写入时被阻止。

由于您在运行时没有消耗reg命令的输出,因此它可能已填充输出缓冲区,并且在写入更多内容之前等待您读取某些输出。

例如,如果向注册表项添加了更多值,则可能会破坏之前有效的查询。

我建议创建一个用于读取进程标准输出流的线程,另一个用于读取其标准错误流。当您阅读完所有输出后,标准输出流将发出EOF信号(这将导致BufferedReader返回null)。

此时,对waitFor()的调用不应该阻塞(这通常不是一个安全的假设,但对reg命令是可以的)。最后,您应该destroy()这个过程。