在windows-10上的cygwin上阅读java中的EOF

我在cygwin上使用java实用程序(antlr),java是windows版本,我从cygwin bash运行javac / java。

以下java代码用于在win8.1上运行cygwin,从stdin到EOF读取一系列数字(改编自java中的读取输入到EOF ):

import java.util.Scanner; public class Hello { public static void main(String[] args) { System.out.println("Hello, World"); Scanner in = new Scanner(System.in); int num; while (in.hasNextInt()) { num = in.nextInt(); System.out.printf("%d\n",num); } } } 

最近我买了一台新的win10笔记本电脑,上面安装了cygwin,它不再用了。 当我按下Ctrl-D时,程序继续等待输入,它不被视为EOF。

经过一些调试(参见windows 10中cygwin中EOF的注释),“stty -a”报告“eof = ^ D; susp = ^ Z”,因此预计Ctrl-D将被视为EOF。 c ++中的以下等效代码按预期工作,可能是因为此代码是使用cygwin本身编译的,因此将^ D视为EOF。

 #include  int main() { int i=0, status; for(;;) { printf("Enter a value %d:\n", i); status = scanf("%d", &i); if(status!=1) break; } } 

所以在cygwin-win10的组合中似乎有些东西被打破了。 什么提示,什么可以打破以及如何解决?

注意:我使用的是java jdk-7u72

使用cygwin时,我使用windows本身的java安装。 以下是用法:

在cygwin中: javac Hello.java; java你好

然后给出输入,接着是^ D在一个新行中(即在输入Return后立即)。

在Windows中:我也尝试在Windows中运行相同的程序,只是为了确定它是windows还是cygwin问题。 所以我也在这里运行:javac Hello.java; java你好

然后给出输入,然后在新行中(即在进入Return后立即)^ D(或^ Z)。 当我按^ D或^ Z时,程序正确终止。

在非Cygwin Windows程序中,输入上的Ctrl-Z会触发文件结束条件。

在Cygwin程序中,使用Cygwin DLL,输入触发器上的Ctrl-D和文件结束条件。 (这可以使用stty命令重新配置,但您还没有这样做。)

程序的执行方式无关紧要。 它只关系它的构建方式。

您正在运行的程序是java命令,它是一个非Cygwin Windows可执行文件。 ( java命令恰好运行Java程序。)由于java是非Cygwin Windows程序,因此它将Ctrl-Z视为文件结束字符。

据我所知,你描述的所有行为都与此一致。

如果您希望Java程序像Cygwin程序一样运行,则必须使用构建为使用Cygwin的Java系统。 我不确定这是否可行,但这超出了这个问题的范围,所以我会把它留给你和Google搜索。