System.out.println без печати в файл при использовании «> имени файла» - PullRequest
4 голосов
/ 11 декабря 2011

У меня особенная проблема. У меня есть Java-программа, которая запускается с командой:

cat input_file_name | ./script_name > file_output_name

скрипт script_name просто выполняет: java myprogram

У меня вопрос: как я могу распечатать что-то в консоли, не помещая ее в файл file_output_name (поскольку > file помещает все System.out.prints в этот файл)

Я знаю, что это возможно, потому что некоторые из них уже получены из некоторого класса в библиотеке, которую я использую из моей Java-программы. Однако я не могу найти точный источник этих отпечатков, поэтому я не знаю, как они закодированы.

Спасибо за любую помощь.

Ответы [ 4 ]

2 голосов
/ 11 декабря 2011

Простой ответ - записать эти сообщения в System.err, а не System.out.

Это будет работать, поскольку > перенаправляет стандартный вывод, но не стандартную ошибку. (Вы можете перенаправить стандартную ошибку, но синтаксис оболочки другой; например, foo 2> /tmp/somefile.)

Более сложная альтернатива - изменить вашу программу так, чтобы ее можно было вызывать с именем выходного файла в качестве аргумента. Затем откройте файл, оберните его в PrintWriter и запишите в этот поток вместо System.out. После небольшого рефакторинга вы сможете структурировать свою программу так, чтобы ее можно было использовать в любом случае.

1 голос
/ 11 декабря 2011

Самый простой способ - использовать System.err.println() вместо System.out.

Он перейдет на другое «устройство» (stderr вместо stdout) и не будет перенаправлен.

1 голос
/ 11 декабря 2011

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

0 голосов
/ 11 декабря 2011

Обратите внимание, что если Java-программа пишет в стандартный вывод, она не может контролировать , где перенаправляет вывод, это зависит от того, как программа вызывается из командной строки.

Имея это значение, вы можете перенаправить стандартный вывод программы only на консоль, просто удалив часть > file_output_name из команды.

Или вы можете перенаправить вывод программы на консоль и в файл, используя команду tee, взгляните на эту статью , которая подробно объясняет как это сделать.

...