Java Scanner hasNextLine()阻塞问题

时间:2017-04-10 15:41:13

标签: java java.util.scanner

我已经看过类似的主题,但似乎无法拼凑出一个有效的解决方案。我正在编写一个程序(部分)从stdin中读取值以执行某些操作。但是,我打算在运行时重定向文本文件中的输入,所以我不能只使用Ctrl + Z(窗口)发出EOF。

foreach( BoundarySegment s in b )
...
Element neighbour = s.Element;

我似乎永远无法达到最终的打印声明,因为(无论如何我的猜测)似乎hasNextLine()无限期阻塞。

以下是输入文件格式的示例:

    String s;
    int v2 = 0;
    double w = 0;
    int v1 = 0;
    int i = 0;
    Scanner sc = new Scanner(System.in);
    while(sc.hasNextLine()){
        s = sc.nextLine();
        String[] arr = s.trim().split("\\s+");

        v1 = Integer.parseInt(arr[0]);
        v2 = Integer.parseInt(arr[1]);
        w = Double.parseDouble(arr[2]);

        i++;
    }
    System.out.println(i);
    sc.close();

它始终采用int int double的格式,但它们之间的间距可以变化,因此字符串操作也是如此。它也总是以-1结束。

我尝试过以下无效

 0   1    5.0
 1   2    5.0
 2   3    5.0
 3   4    5.0
 4   5    5.0
12  13    5.0
13  14    5.0
14  15    5.0
...
-1

我遗漏了大部分与避免混乱无关的代码。如果需要,我可以发帖。

谢谢你看看。

编辑:编辑清晰。还注意到它挂在输入文件的最后一行而不管行内容(即有效行挂起)。我通过eclipse(Neon)重定向。

1 个答案:

答案 0 :(得分:0)

你的代码似乎运作良好。虽然你可以检查hasNextLine以及如果自定义EOF,检查其他一些条件(在你的情况下有-1)。如果您的代码容易出现,您可能会遇到一些异常。下面的代码对我来说效果很好。

        Scanner scanner = new Scanner(new File("/opt/test.txt"));
        int secondValue = 0;
        double lastValue = 0;
        int firstValue = 0;
        int LineNumber = 0;
        while ((scanner.hasNextLine()) ) {
            try {

                String[] arr = scanner.nextLine().trim().split("\\s+");

                firstValue = Integer.parseInt(arr[0]);
                secondValue = Integer.parseInt(arr[1]);
                lastValue = Double.parseDouble(arr[2]);
                doSomeThing(firstValue,secondValue,lastValue);

                LineNumber++;
            } catch (Exception excep) {

            }
        }
        System.out.println(LineNumber);
}