有没有办法将标准输出重定向到内存数据结构,这样我以后可以在没有硬盘操作的情况下读取它?
实际上,我想让 ClassLoader 运行两个程序,然后捕获并比较它们的输出。我必须运行很多测试用例,所以我不想将输出重定向到临时文件,因为硬盘真的很慢。
您可以在程序开始时执行以下操作:
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final PrintStream stream = new PrintStream(out);
System.setOut(stream);
但是,要小心这种流的不受控制的增长,如果你不小心,你可能会饱和你的记忆。请注意,这将处理 stdout 而不是stderr (为此,您也需.setErr()
要这样做。
最后一点:你为什么要这样做?
如果要比较两个程序的输出,我建议使用ProcessBuilder。返回的Process
对象ProcessBuilder.start()
将使您能够访问子进程的标准流,您可以在闲暇时阅读它们。
这也将使您受益于同时运行子进程。而且它不会冒用完permgen的风险。
只是一个建议:
编写您自己的包装方法来封装标准输出并将输出文本推送到内存数据结构中。像这样的东西:
public static mySysout(String msg) {
System.out.println(msg);
// add the input msg to your datastructure
}