如何将标准输出重定向到Java中的内存中结构?

时间:2013-07-12 17:12:11

标签: java output

有没有办法将stdout重定向到内存数据结构,以便以后可以在没有硬盘驱动器操作的情况下读取它?

实际上,我希望ClassLoader运行两个程序,然后捕获并比较它们的输出。我必须运行大量的测试用例,所以我不想将输出重定向到临时文件,因为硬盘真的很慢。

4 个答案:

答案 0 :(得分:9)

您可以在程序开始时执行以下操作:

final ByteArrayOutputStream out = new ByteArrayOutputStream();
final PrintStream stream = new PrintStream(out);
System.setOut(stream);

但是,要注意这种流的不受控制的增长,如果你不小心,你可能会使你的记忆饱和。请注意,这将处理标准输出,但不是 stderr(为此您还需要.setErr()

另请参阅javadoc for ByteArrayOutputStream


最后说明:你为什么要这样做?

答案 1 :(得分:1)

如果您想比较两个程序的输出,我建议使用ProcessBuilderProcess返回的ProcessBuilder.start()对象可让您访问子流程的标准流,您可以随意阅读它们。

这也将为您提供同时运行子进程的好处。并且不会冒失去permgen的风险。

答案 2 :(得分:0)

您可以使用Java Caching System存储数据。请参阅此内容以获取更多information

答案 3 :(得分:0)

只是一个建议:

编写自己的包装器方法来封装stdout并将输出文本推送到内存中的数据结构。像这样:

public static mySysout(String msg) {
    System.out.println(msg);
    // add the input msg to your datastructure
}