Java ProcessBuilder: как подавить вывод вместо его перенаправления - PullRequest
4 голосов
/ 11 апреля 2019

Я использую ProcessBuilder для выполнения команд и перенаправления вывода. Теперь я хочу добавить возможность вообще не выводить.

Конечно, я мог бы перенаправить в файл, но это оставило бы ненужные файлы в системе пользователя.

Я ищу решение, которое

  • работает на всех платформах, включая Windows (например, без перенаправления в / dev / null)
  • не использует try-catch (например, перенаправление на ноль и игнорирование исключения)

Единственный способ найти это было так:

ProcessBuilder processBuilder = new ProcessBuilder(command);
if (suppressOutput) {
        processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
}

Но это печатает на базовую оболочку, которая буквально не "без вывода".

Вот мое использование processBuilder с невыполненным выводом:

ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.directory(new File(workingdir));
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();

while (process.isAlive()) {
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) { }
    // check for termination request
    if (terminationRequest()) {
        process.destroy();
        return -1;
    }
}
return process.exitValue();

1 Ответ

5 голосов
/ 11 апреля 2019

Параметр перенаправления DISCARD был добавлен в Java 9. Вы можете использовать его, если обновите Java. В противном случае вы могли бы просто повторить это поведение, потому что перечисление DISCARD redirect использует экземпляр файла, который перенаправляет на нулевое устройство, как показано ниже.

   private static File NULL_FILE = new File(
          (System.getProperty("os.name")
                     .startsWith("Windows") ? "NUL" : "/dev/null")
   );

Тогда вы можете использовать перегруженный метод redirectOutput;

if (suppressOutput) {
   processBuilder.redirectOutput(NULL_FILE);
}

Это идентично поведению Java 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...