2010-11-25 61 views
1

有没有一种方法可以逐行捕获我的Java程序的stdout和stderror?Java:将stdout和stderr编程到某种处理程序

也许类似于您使用addHandler向记录器实例添加处理程序的方式。

编辑:我不想更换默认处理程序 - 我仍然需要输出显示在命令行上。

+0

要求是什么原因?如果是用于日志记录或调试,则应考虑使用日志记录框架而不是stderr和stdout。如果你使用的是* nix系统,你可以将stdout和stderr重定向到一个文件中并拖拽文件... – beggs 2010-11-25 03:19:55

+0

我正在编写一个流API,您可以在其中获得该程序的控制台输出。所以无论进入控制台还可以将其视为一个http流。 – 2010-11-25 03:33:01

回答

3

通过使用System.setOut()System.setErr()您可以将标准输出和错误流设置为任何PrintStream并捕获所有内容。

此外: 我不知道是否存在任何优雅的方式来做到这一点,但这样做的一个方法是:
1.保存默认的输出流
的PrintStream defaultOut = System.out的;
(System.getOut()虽然会很有趣)
2.将System.out重定向到您想要的打印流(例如任何文件)
3.不要使用System.out.println()函数,它的确如下:
print(Object o){
defaultOut.println(o); //假设defaultOut在这个函数中是可见的
System.out.println(o); }

2

的方法System.setOutSystem.setErr允许您更改PrintStream对象的System.outSystem.err变量参考。您可以使用它们将捕获输出的对象替换为默认的对象,或者使用它来执行任何您想要的操作。

随访

我不想更换PrintStreams,因为我还需要输出去命令行。

您的代码可以照顾的是:

  1. 创建的OutputStream一个子类,它会将所有输出到另一个OutputStream实例,还捕获输出。使“其他”实例成为一个构造参数。
  2. 获取当前值System.outSystem.err
  3. 实例化您的子类两次,其中System.outSystem.err值分别作为构造函数参数。
  4. 将这两个实例包装为PrintStream实例。
  5. 请致电System.setOutSystem.setErrSystem.outSystem.err替换为PrintStream实例。
+0

我迟了13秒:( – 2010-11-25 02:55:13