使用Java运行时添加注册表项,导致进程reg.exe永远运行

时间:2011-11-15 12:32:02

标签: java windows process registry

我有这个代码将可执行文件插入启动注册表:

private static void addToWin( File f, String param ) throws IOException {
    String name = generateName(f);
    String cmd = "reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v " + name + " /t REG_SZ /d \"" + f.getAbsolutePath() + param + "\"";
    Runtime.getRuntime().exec(cmd);
}

这样可行,但问题是运行后我在任务管理器中有一个名为reg.exe的进程占用了10%的CPU。这可以防止JVM在运行结束时关闭(即使最后使用System.exit())

从注册表中删除相同条目的代码运行良好,并且没有此问题。

您是否知道发生了什么以及如何解决这个问题?

三江源

2 个答案:

答案 0 :(得分:2)

如果进程将某些内容写入其标准输出并且您不使用该输出,则可能会发生这种情况。请参阅java.lang.Process的Javadoc。

答案 1 :(得分:2)

我似乎记得有一个类似的问题,并发现该过程在其输出被消耗之前不会终止。尝试保持对运行时exec方法返回的Process对象的引用,如此...

Process proc = Runtime.getRuntime().exec(cmd);

...然后从Process获取一个输入流,只需从中读取它直到它结束。

InputStream ips = proc.getInputStream();
while(ips.read() != -1) {}

需要添加错误处理。您可能必须对stderr执行相同操作,而不仅仅是stdout。

编辑:哦,当然不要忘记关闭流。看起来像是系统资源的那种东西。