我有这个代码将可执行文件插入启动注册表:
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())
从注册表中删除相同条目的代码运行良好,并且没有此问题。
您是否知道发生了什么以及如何解决这个问题?
三江源
答案 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。
编辑:哦,当然不要忘记关闭流。看起来像是系统资源的那种东西。