当前位置:  开发笔记 > 编程语言 > 正文

Java - 捕获System.err.println或捕获PrintStream

如何解决《Java-捕获System.err.println或捕获PrintStream》经验,为你挑选了3个好方法。

Java新手问题:

我需要捕获第三方组件写入printStream的文本.

PrintStream默认为System.err,但可以更改为另一个PrintStream.

浏览文档,我找不到一种简单的方法将PrintStream的内容定向到字符串编写器/缓冲区.

有人可以帮忙吗?



1> Joao da Silv..:
PipedOutputStream pipeOut = new PipedOutputStream();
PipedInputStream pipeIn = new PipedInputStream(pipeOut);
System.setOut(new PrintStream(pipeOut));
// now read from pipeIn


建议不要这样做,文档说明"一个线程将数据写入PipedOutputStream对象,并且某些其他线程从连接的PipedInputStream中读取数据.不建议尝试使用单个线程中的两个对象,因为它可能使线程死锁".http://docs.oracle.com/javase/1.4.2/docs/api/java/io/PipedOutputStream.html

2> Johannes Wei..:
import java.io.*;

public class Test {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream("errors.txt");
        } catch(IOException ioe) {
            System.err.println("redirection not possible: "+ioe);
            System.exit(-1);
        }
        PrintStream ps = new PrintStream(fos);
        System.setErr(ps);
        System.err.println("goes into file");
    }
}



3> Dave Costa..:

您可以围绕任何其他OutputStream创建PrintStream.

创建一个转到内存缓冲区的最简单方法是:

PrintStream p = new PrintStream( new ByteArrayOutputStream() )

然后,您可以在任何您喜欢的点读取和重置字节数组的内容.

另一种可能性是使用管道.

InputStream third_party_output = new PipedInputStream();
PrintStream p = new PrintStream( new PipedOutputStream( third_party_output ) );

然后,您可以从third_party_output流中读取以获取库写入的文本.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有