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

时间:2016-09-05 09:42:28

标签: java cygwin

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

以下java代码用于在win8.1上运行cygwin,从stdin读取一系列数字直到EOF(改编自reading input till EOF in java):

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。

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

#include <stdio.h>
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 Hello

然后输入输入,然后在新行中显示^ D(即在输入Return后立即。

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

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

1 个答案:

答案 0 :(得分:0)

在非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搜索。