Java:将stdout和stderr编程为某种处理程序

Java:将stdout和stderr编程为某种处理程序,java,stdout,handler,stderr,Java,Stdout,Handler,Stderr,有没有办法逐行捕获Java程序的stdout和stderror 可能与使用addHandler将处理程序添加到记录器实例的方式类似 编辑:我不想替换默认的处理程序——我仍然需要输出显示在命令行上。方法System.setOut和System.setErr允许您更改System.out和System.err变量引用的PrintStream对象。您可以使用它们将默认的PrintStream对象替换为捕获输出的对象,或者对其执行任何操作 跟进 我不想替换PrintStreams,因为我仍然需要输出到命

有没有办法逐行捕获Java程序的stdout和stderror

可能与使用
addHandler
将处理程序添加到记录器实例的方式类似


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

方法
System.setOut
System.setErr
允许您更改
System.out
System.err
变量引用的
PrintStream
对象。您可以使用它们将默认的
PrintStream
对象替换为捕获输出的对象,或者对其执行任何操作

跟进


我不想替换PrintStreams,因为我仍然需要输出到命令行

您的代码可以处理以下问题:

  • 创建
    OutputStream
    的子类,将所有输出写入另一个
    OutputStream
    实例,并捕获输出。将“other”实例设为constructort参数
  • 获取
    System.out
    System.err
    的当前值
  • 实例化子类两次,分别使用
    System.out
    System.err
    值作为构造函数参数
  • 将这两个实例包装为
    PrintStream
    实例
  • 调用
    System.out
    System.setErr
    PrintStream
    实例替换
    System.out
    System.err
  • 通过使用和,您可以将标准输出和错误流设置为任何打印流,并捕获所有内容

    添加: 我不知道是否有任何优雅的方法可以做到这一点,但有一种方法是:
    1.保存默认输出流
    PrintStream defaultOut=System.out
    (System.getOut()会很有趣)
    2.将System.out重定向到所需的打印流(例如任何文件)
    3.不要使用System.out.println()函数,而是使用print函数,它执行以下操作:
    打印(对象o){
    defaultOut.println(o);//假设defaultOut在此函数中可见
    系统输出打印ln(o);
    }

    允许您在文本窗格中显示输出,并将其显示在命令行上。

    请记住,这将重定向System.out和System.err流,但不会重定向JVM直接打印的任何内容,例如执行“kill-3”时我不想替换PrintStreams,因为我仍然需要输出到命令行。@Paul Tomblin-没错。不幸的是,除了破解JVM代码库,或者从另一个JVM.interest启动JVM之外,您无能为力。我实现它的方法是通过扩展
    ByteArrayOutputStream
    ,重写flush,然后使用
    新的PrintStream(newhandlesdout())
    。有什么不同吗?我不想替换PrintStreams,因为我仍然需要输出到命令行。需要的原因是什么?如果要进行日志记录或调试,您应该考虑使用日志框架而不是STDRR和STDUT。如果您在*nix系统上,您可以将stdout和stderr重定向到一个文件并跟踪该文件……我正在编写一个流式API,您可以在其中获得程序的控制台输出。因此,进入控制台的任何内容也可以被视为http流。