Независимый от платформы способ отбросить / ошибиться с помощью ProcessBuilder

В Unix вы можете отменить вывод процесса с помощью:

pb.redirectOutput(new File("/dev/null"));

В то время как на Windows вам нужно использовать вместо NUL, Есть ли лучший вариант, чем следующий фрагмент для поддержки произвольных платформ?

File devNull = new File("/dev/null");
if (devNull.exists()) {
  pb.redirectOutput(devNull);
} else {
  pb.redirectOutput(new File("NUL"));
}

Это кажется глупым, но нет ProcessBuilder.Redirect.NULL поле для использования или, казалось бы, любой другой способ сделать это в API.

Я также немного обеспокоен тем, что это не относится к случаю не-Unix-не-Windows (но я не уверен, существует ли такой случай).

Я знаю о платформно-независимом /dev/null выходном приемнике для Java и подобных вопросах, однако использую no-op OutputStream все еще требует раскручивания потока, чтобы активно отбрасывать вывод - я бы предпочел, чтобы ОС сделала это за меня.

1 ответ

Решение

Судя по поведению Питона subprocess Модуль фрагмент кода в вопросе, вероятно, достаточно. subprocess.DEVNULL использования os.devnull который в свою очередь исходит от os.path который определяется либо в ntpath (как nul) или же posixpath (как /dev/null).

Похоже, это единственные пути, которые поддерживает Python, поэтому аналогично nul или же /dev/null при необходимости должно быть достаточно в Java. Может быть более элегантный, независимый от платформы вариант для Java, но в таком случае я его не нашел.

Другие вопросы по тегам