Подтвердить что ты не робот

Java: запись в реальный STDOUT после System.setOut

Я пытаюсь перехватить System.out и System.err, но сохраняю способность писать исходные потоки, когда это необходимо.

PrintStream ps = System.out;
System.setOut(new MyMagicPrintStream());
ps.println("foo");

К сожалению, детали реализации класса System означают, что в моем примере "foo" отправляется в MyMagicPrintStream, чтобы начать реальную запись. Кто-нибудь знает, как получить ссылки на реальные/исходные OutputStreams.

Спасибо!

PS: В противном случае это приведет к созданию StackOverflowError < - для SEO.

4b9b3361

Ответ 1

попробуйте следующее:

PrintStream ps = new PrintStream(new FileOutputStream(FileDescriptor.out))

Ответ 2

Попробуйте что-то вроде этого:

  PrintStream original = new PrintStream(System.out);

  // replace the System.out, here I redirect to NUL
  System.setOut(new PrintStream(new FileOutputStream("NUL:")));
  System.out.println("bar");  // no output

  // the original stream is still available 
  original.println("foo");  // output to stdout

Ответ 3

PrintStream original = System.out;
System.setOut(new MyMagicPrintStream());

// This will print to MyMagicPrintStream();
System.out.println("foo for MyMagicPrintStream");


System.setOut(original);

// This will print to original print stream;
System.out.println("foo for original print stream (stdout)");

Это работает для меня.

Ответ 4

PrintStream original = new PrintStream(System.out); в основном обертывает существующую ссылку - поэтому, если System.setOut() меняет ее - не должно быть разницы. Вероятно, это проблема с конкретным JVM, но я предпочел бы, что что-то не так с MyMagicPrintStream или кодом, записываемым в stdout. На самом деле следующий фрагмент кода делает именно то, что ожидается на Sun 1.6.0_20-b02 для Windows:

import java.io.FileOutputStream;
import java.io.PrintStream;

public class SystemOutTest {

public static void main(String args[]) {
    try {
        PrintStream ps = System.out;
        System.setOut(new PrintStream(new FileOutputStream("stdout.log")));

        System.out.println("foo");  
        ps.println("bar");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

"foo" переходит в stdout.log, "bar" на консоль.

Кроме того, если вам нужно получить исходный stdin/out, назначенный для запуска JVM, вы можете использовать System.console(); (просто помните - это может быть null!)