Java 在Ctrl-D之后重用System.in

Java 在Ctrl-D之后重用System.in,java,Java,我有两组数据需要从未知大小的用户那里获取,如果用户可以使用Ctrl-D(我相信Windows中的Ctrl-Z)指定输入的结尾,我希望这样做 这对于第一组来说是完美的,但是第二组什么也看不到。事实上,在EOF发送到控制台后,我无法从系统中读取程序剩余部分的所有内容(readLine()将始终返回null) 如何在中有效地“重新打开”系统,以便在EOF输入后读取更多输入 下面是一些示例代码,以表达我试图实现的目标: 公共类主{ 公共静态void main(字符串[]args)引发IOExceptio

我有两组数据需要从未知大小的用户那里获取,如果用户可以使用Ctrl-D(我相信Windows中的Ctrl-Z)指定输入的结尾,我希望这样做

这对于第一组来说是完美的,但是第二组什么也看不到。事实上,在EOF发送到控制台后,我无法从
系统中读取程序剩余部分的所有内容(
readLine()
将始终返回null)

如何在
中有效地“重新打开”
系统,以便在EOF输入后读取更多输入

下面是一些示例代码,以表达我试图实现的目标:

公共类主{
公共静态void main(字符串[]args)引发IOException{
BufferedReader systemIn=新的BufferedReader(新的InputStreamReader(System.in,StandardCharsets.UTF_8));
弦线;
System.out.println(“输入第一个输入(Ctrl-D关闭)”;
而((line=systemIn.readLine())!=null){
System.out.printf(“收到的输入%s%n”,第行);
}
System.out.println(“已收到第一次输入!\n”);
//我在这里放什么来再次使用System.in?
System.out.println(“输入第二个输入(Ctrl-D关闭)”;
而((line=systemIn.readLine())!=null){
System.out.printf(“收到的输入%s%n”,第行);
}
System.out.println(“已收到第二次输入!\n”);
}
}

@saka129不幸的是,这不是我的问题,因为流没有关闭。如果关闭了,第二个while循环将抛出
java.io.IOException:Stream closed
,但它没有抛出
readLine
总是简单地返回null。一旦达到EOF,就不可能重置流的状态以便您可以继续从中读取。我无法在macOS和使用JDK 8和12的Linux上重现此问题。它在Ctrl-D之后读取第二个输入。你确定Java的stdin是tty吗?@JimGarrison所以,在Java中根本不可能这样做?我知道在C语言中,它就像打电话一样简单。如果这仅仅是一种语言限制,那将是非常不幸的。IDE无疑使用管道与进程通信,而这种Ctrl-D行为是特定于tty设备的。我真的建议另外也接受一个空行或一行上的单点来结束输入,这样程序就可以很容易地在其他环境中使用,比如自动化、inetd或通过这样的IDE。