在java中获取控制台文本

Sir*_*lot 1 java printing console

有没有办法从控制台检索已输出的输出:

System.out.print("blabla");
Run Code Online (Sandbox Code Playgroud)

Cos*_*atu 5

如果你想能够看到你已经写入控制台的内容,你需要编写自己的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();
    }

}
Run Code Online (Sandbox Code Playgroud)

您还可能需要处理线程安全(StringBuffer是线程安全的,但您可能需要更多).

完成上述操作后,您可以:

RememberAllWrittenTextPrintStream ps
        = new RememberAllWrittenTextPrintStream(System.out);
System.setOut(ps);
System.out.print("bla");
System.out.print("bla");
ps.getAllWrittenText(); // should now return "blabla"
Run Code Online (Sandbox Code Playgroud)

编辑:println()使用独立于平台的添加实现newLine.