试图从过去读取控制台打印Java

时间:2017-09-27 14:37:51

标签: java io

我正在尝试根据是否打印了以前的特定消息打印出消息。这是我的代码:

public class Main {

    public static Runnable getRunnable() {

    return () -> {
        System.out.println("Hello from a thread");

    };
}

public static void main(String[] args){

    new Thread(getRunnable()).start();

    Scanner scanner = new Scanner(System.in);
    String name = scanner.next();

        if (name.equals("Hello from a thread")) {
            System.out.println("Hi!");
    } else {
            System.out.println("That's not nice");
        }
    }
}

我知道Scanner可能不是这里的解决方案,但每当我尝试其他类似System.console.readLine()的内容时,它可能也不正确,它会打印出NullPointerException。我应该在这里用什么来阅读以前的输出?

更新:嘿,我再试一次,但没有成功......不知道为什么又一次。这是我更新的代码

public static ByteArrayOutputStream baos = new ByteArrayOutputStream();
public static PrintStream ps = new PrintStream(baos);
public static PrintStream old = System.out;

public static Runnable getRunnable() {
    System.out.println("Hello from a thread");
    return () -> {
        System.setOut(ps);
        System.out.println("Hello from a thread");
    };
}

public static void main(String[] args){

    new Thread(getRunnable()).start();

    try {
        TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
        System.out.println("Somethings wrong!");
    }

    System.out.flush();
    System.setOut(old);
    if (baos.toString().equals("Hello from a thread")) {
        System.out.println("Hello other thread!");
    }

}

}

1 个答案:

答案 0 :(得分:1)

System.out不是System.in

System.out是标准输出流,通常打印到控制台。 System.in是标准输入流,通常从控制台获取。您可以执行setOutsetInsetErr来更改I / O流,因此对于您的情况,您需要重定向in以从源读取out输出到该来源。您可以考虑使用ArrayList来存储和检索输出/输入:

final List<Integer> list = new ArrayList<>();
System.setOut(new PrintStream(new OutputStream() {
    public void write(int b) {
        list.add(b);
    }
}));
System.setIn(new InputStream() {
    public int read() {
        if (list.size() == 0) return -1;
        return list.remove(0);
    }
});

(请注意,由于各种原因,您可能希望执行setErr,这样您仍然可以正确输出内容。)

您可以尝试使用此here

的实例