我正在尝试根据是否打印了以前的特定消息打印出消息。这是我的代码:
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!");
}
}
}
答案 0 :(得分:1)
System.out
不是System.in
System.out
是标准输出流,通常打印到控制台。 System.in
是标准输入流,通常从控制台获取。您可以执行setOut
,setIn
和setErr
来更改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
的实例