Использование среды выполнения Java для добавления раздела реестра, чтобы процесс reg.exe работал вечно - PullRequest
1 голос
/ 15 ноября 2011

У меня есть этот код для вставки исполняемого файла в реестр запуска:

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% процессора.Это предотвращает завершение работы JVM в конце работы (даже с System.exit () в конце)

Код, удаляющий ту же запись из реестра, работает хорошо и не имеет этой проблемы.

У вас есть представление о том, что происходит и как это решить?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Кажется, я помню, что у меня была похожая проблема, и я обнаружил, что процесс не завершится, пока не будет использован его вывод.Попробуйте сохранить ссылку на объект Process, возвращенный методом exec времени выполнения, например так ...

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

... затем получите входной поток из процесса и просто прочитайте его, пока он не закончится.

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

Необходимо добавить обработку ошибок.Возможно, вам придется сделать то же самое для stderr, а не только для stdout.

РЕДАКТИРОВАТЬ: о, и, конечно же, не забудьте закрыть поток.Похоже на то, что держится за системные ресурсы.

2 голосов
/ 15 ноября 2011

Это может произойти, если процесс записывает что-то в свой стандартный вывод, и вы не используете этот вывод. См. Javadoc java.lang.Process.

...