有没有办法将stdout重定向到内存数据结构,以便以后可以在没有硬盘驱动器操作的情况下读取它?
实际上,我希望ClassLoader运行两个程序,然后捕获并比较它们的输出。我必须运行大量的测试用例,所以我不想将输出重定向到临时文件,因为硬盘真的很慢。
答案 0 :(得分:9)
您可以在程序开始时执行以下操作:
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final PrintStream stream = new PrintStream(out);
System.setOut(stream);
但是,要注意这种流的不受控制的增长,如果你不小心,你可能会使你的记忆饱和。请注意,这将处理标准输出,但不是 stderr(为此您还需要.setErr()
。
另请参阅javadoc for ByteArrayOutputStream
。
最后说明:你为什么要这样做?
答案 1 :(得分:1)
如果您想比较两个程序的输出,我建议使用ProcessBuilder。 Process
返回的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
}