【问题标题】:Scanner.hasNextLine - always trueScanner.hasNextLine - 始终为真
【发布时间】:2020-08-29 22:36:27
【问题描述】:

我需要从标准输入读取数据。 我想将它打印到标准输出。 我为此使用扫描仪:

import java.util.Scanner;
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        int countLines = 1;
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            sb.append(countLines).append(" ").append(line);
        }
        System.out.println("finish");
        System.out.println(sb.toString());
        scanner.close();
    }

我输入了这个数据:

Hello world
I am a file
Read me until end-of-file.

hasNextLine()) 始终是true。结果永远不会打印“finish

【问题讨论】:

标签: java java-8


【解决方案1】:

您的代码似乎运行良好。你确定你输出EOF正确吗?尝试 Ctrl+D(Mac 上的 Cmd+D)或 Windows 上的 Ctrl+Z,如下所述:How to send EOF via Windows terminal

【讨论】:

    【解决方案2】:

    循环不会为假,它会永远读取这些行。考虑添加一个停止关键字,例如“stop”

    while(scanner.hasNextLine()) 
    {
        String line = scanner.nextLine(); 
        if(line.equalsIgnoreCase("stop")) 
        {
            break; 
        }
        //whatever else you have in the loop
    }
    

    除非你阻止它,否则它永远都是真的。正如@Aaron 指出的那样

    Scanner.hasNextLine() 阻塞等待换行,如果你关闭流,它只会返回 false(使用 Ctrl-Z 或 D,正如 Liel 在他的回答中提到的那样)

    【讨论】:

    • 您的回答没有指出 为什么 OP 的代码不起作用。在 cmets 中已经指出了这一点,但为了完整起见,也许您可​​以将其添加到您的 sesponse 中?
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 2015-12-05
    • 2019-02-01
    • 2021-01-07
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多