Looking for java Keywords? Try Ask4Keywords

Java Language Блокирование или перенаправление стандартного вывода / ошибки


пример

Иногда плохо разработанная сторонняя библиотека будет писать нежелательную диагностику в потоки System.out или System.err . Рекомендуемые решения для этого - либо найти лучшую библиотеку, либо (в случае с открытым исходным кодом) исправить эту проблему и внести исправления разработчикам.

Если вышеупомянутые решения не осуществимы, вам следует рассмотреть возможность перенаправления потоков.

Перенаправление в командной строке

В UNIX, Linux или MacOSX система может быть выполнена из оболочки с помощью > перенаправления. Например:

$ java -jar app.jar arg1 arg2 > /dev/null 2>&1
$ java -jar app.jar arg1 arg2 > out.log 2> error.log

Первый перенаправляет стандартный вывод и стандартную ошибку на «/ dev / null», которая отбрасывает все, что написано в эти потоки. Второй из перенаправляет стандартный вывод на «out.log» и стандартную ошибку на «error.log».

(Для получения дополнительной информации о перенаправлении см. Документацию используемой командной оболочки. Аналогичные рекомендации относятся к Windows.)

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

Перенаправление в приложении Java

Также возможно перенастроить потоки в Java-приложении, используя System.setOut() и System.setErr() . Например, следующий фрагмент перенаправляет стандартный вывод и стандартную ошибку на 2 файла журнала:

System.setOut(new PrintStream(new FileOutputStream(new File("out.log"))));
System.setErr(new PrintStream(new FileOutputStream(new File("err.log"))));

Если вы хотите полностью отбросить вывод, вы можете создать выходной поток, который «пишет» на недопустимый дескриптор файла. Это функционально эквивалентно записи в «/ dev / null» в UNIX.

System.setOut(new PrintStream(new FileOutputStream(new FileDescriptor())));
System.setErr(new PrintStream(new FileOutputStream(new FileDescriptor())));

Внимание: будьте осторожны, как вы используете setOut и setErr :

  1. Перенаправление повлияет на всю JVM.
  2. Делая это, вы убираете способность пользователя перенаправлять потоки из командной строки.