Поскольку вопрос, который вы связали с состояниями, лучше читать и отбрасывать потоки вывода и ошибок.Если вы используете apache commons io, что-то вроде
new Thread(new Runnable() {public void run() {IOUtils.copy(process.getInputStream(), new NullOutputStream());}}).start();
new Thread(new Runnable() {public void run() {IOUtils.copy(process.getErrorStream(), new NullOutputStream());}}).start();
Вы хотите читать и отбрасывать stdout и stderr в отдельном потоке, чтобы избежать проблем, таких как блокировка процесса, когда он записывает достаточно информации в stderr или stdoutчтобы заполнить буфер.
Если вы беспокоитесь о наличии множества потоков, см. этот вопрос
Не думаю, что вам нужно беспокоиться о перехвате исключений IOException при копированииstdout, stdin для NullOutputStream, поскольку при чтении IOException из процесса stdout / stdin это, вероятно, связано с тем, что сам процесс мертв, и запись в NullOutputStream никогда не вызовет исключение.
Вы не 'Не нужно проверять возвращаемый статус waitFor ().
Хотите дождаться завершения процесса?Если это так, вы можете сделать,
while(true) {
try
{
process.waitFor();
break;
} catch(InterruptedException e) {
//ignore, spurious interrupted exceptions can occur
}
}
Просматривая предоставленную вами ссылку, вам нужно закрыть потоки после завершения процесса, но уничтожение сделает это за вас.
Итакв конце концов, метод становится,
public void close(Process process) {
if(process == null) return;
new Thread(new Runnable() {public void run() {IOUtils.copy(process.getInputStream(), new NullOutputStream());}}).start();
new Thread(new Runnable() {public void run() {IOUtils.copy(process.getErrorStream(), new NullOutputStream());}}).start();
while(true) {
try
{
process.waitFor();
//this will close stdin, stdout and stderr for the process
process.destroy();
break;
} catch(InterruptedException e) {
//ignore, spurious interrupted exceptions can occur
}
}
}