我一直在通过执行“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很冷。然而,它仍然为我和我的同事工作。今天早上它也为我冻结了,从那以后它就没有用了......
答案 0 :(得分:4)
通常,waitFor()
调用无法返回,因为子进程在写入时被阻止。
由于您在运行时没有消耗reg
命令的输出,因此它可能已填充输出缓冲区,并且在写入更多内容之前等待您读取某些输出。
例如,如果向注册表项添加了更多值,则可能会破坏之前有效的查询。
我建议创建一个用于读取进程标准输出流的线程,另一个用于读取其标准错误流。当您阅读完所有输出后,标准输出流将发出EOF信号(这将导致BufferedReader
返回null
)。
此时,对waitFor()
的调用不应该阻塞(这通常不是一个安全的假设,但对reg
命令是可以的)。最后,您应该destroy()
这个过程。