【问题标题】:Get console text in java在java中获取控制台文本
【发布时间】:2011-02-05 10:08:02
【问题描述】:

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

System.out.print("blabla");

?

【问题讨论】:

  • 你想在哪里检索它?您想在打印的程序中检索它吗?或者你想在另一个程序中阅读它?
  • 我想通过程序的另一部分来检索它,以制作某种通用测试器。通过查看答案,我找到了一个更好的解决方案,让测试人员可以看到环境

标签: java printing console


【解决方案1】:

如果您希望能够看到您已经写入控制台的内容,您需要编写自己的 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() 实现。

【讨论】:

  • 我已经担心答案不仅仅是一些内置功能,我为我的问题找到了一个更清洁的解决方案。谢谢
【解决方案2】:

如果我理解你的话,你可以从 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

【讨论】:

    【解决方案3】:

    我不知道您的确切要求,但是,如果您想将输出写入多个目的地,请使用任何日志框架。记录器允许更多地控制写入输出。请参阅以下链接了解更多信息,这也是一种最佳做法。

    http://logging.apache.org/index.htmlhttp://www.javaworld.com/javaworld/jw-12-2004/jw-1220-toolbox.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多