【发布时间】:2011-02-05 10:08:02
【问题描述】:
有没有办法从控制台检索输出:
System.out.print("blabla");
?
【问题讨论】:
-
你想在哪里检索它?您想在打印的程序中检索它吗?或者你想在另一个程序中阅读它?
-
我想通过程序的另一部分来检索它,以制作某种通用测试器。通过查看答案,我找到了一个更好的解决方案,让测试人员可以看到环境
有没有办法从控制台检索输出:
System.out.print("blabla");
?
【问题讨论】:
如果您希望能够看到您已经写入控制台的内容,您需要编写自己的 PrintStream 实现,它简单地包装现有的 PrintStream,存储它应该写入的任何内容,然后委托 (所有方法)到包装的(原始)PrintStream 以完成实际工作。如何存储消息完全取决于您的需要(仅存储最后写入的字符串,存储时间戳映射 -> 字符串或其他)。一旦你有了这个,你可以用你自己的实现替换System.out(通过System.setOut()):
public class RememberAllWrittenTextPrintStream extends PrintStream {
private static final String newLine = System.getProperty("line.separator");
private final StringBuffer sb = new StringBuffer();
private final PrintStream original;
public RememberAllWrittenTextPrintStream(PrintStream original) {
this.original = original;
}
public void print(double d) {
sb.append(d);
original.print(d);
}
public void print(String s) {
sb.append(s);
original.print(s);
}
public void println(String s) {
sb.append(s).append(newLine);
original.println(s);
}
public void println() {
sb.append(newLine);
original.println();
}
public void printf(String s, Object... args) {
sb.append( String.format(s, args) );
original.printf(s, args);
}
// .....
// the same for ALL the public methods in PrintStream....
// (your IDE should help you easily create delegates for the `original` methods.)
public String getAllWrittenText() {
return sb.toString();
}
}
您可能还需要注意线程安全(StringBuffer 是线程安全的,但您可能需要更多)。
具备以上条件后,您可以:
RememberAllWrittenTextPrintStream ps
= new RememberAllWrittenTextPrintStream(System.out);
System.setOut(ps);
System.out.print("bla");
System.out.print("bla");
ps.getAllWrittenText(); // should now return "blabla"
编辑:使用独立于平台的newLine 添加了println() 实现。
【讨论】:
如果我理解你的话,你可以从 java 启动一个进程并读取它的输出,如下所示:
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();
OutputStream stdin = process.getOutputStream ();
InputStream stderr = process.getErrorStream ();
InputStream stdout = process.getInputStream ();
BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
String input = scan.nextLine();
...
如果您需要对任何进程(通过 pid、名称等访问)进行更复杂的控制,这是一个非常好的库: Java Service Wrapper
【讨论】:
我不知道您的确切要求,但是,如果您想将输出写入多个目的地,请使用任何日志框架。记录器允许更多地控制写入输出。请参阅以下链接了解更多信息,这也是一种最佳做法。
http://logging.apache.org/index.html 和 http://www.javaworld.com/javaworld/jw-12-2004/jw-1220-toolbox.html
【讨论】: