Ответ 1
попробуйте следующее:
PrintStream ps = new PrintStream(new FileOutputStream(FileDescriptor.out))
Я пытаюсь перехватить System.out и System.err, но сохраняю способность писать исходные потоки, когда это необходимо.
PrintStream ps = System.out;
System.setOut(new MyMagicPrintStream());
ps.println("foo");
К сожалению, детали реализации класса System означают, что в моем примере "foo" отправляется в MyMagicPrintStream, чтобы начать реальную запись. Кто-нибудь знает, как получить ссылки на реальные/исходные OutputStreams.
Спасибо!
PS: В противном случае это приведет к созданию StackOverflowError < - для SEO.
попробуйте следующее:
PrintStream ps = new PrintStream(new FileOutputStream(FileDescriptor.out))
Попробуйте что-то вроде этого:
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
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)");
Это работает для меня.
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
!)