【问题标题】:How to stop reading multiple lines from stdin using Scanner?如何停止使用扫描仪从标准输入读取多行?
【发布时间】:2013-01-19 04:42:59
【问题描述】:

我正在处理一个 JAVA 作业,应该处理多行输入。指令读取“输入是从标准输入读取的。”

给出一个示例输入示例:

one 1
two 2
three 3

我不明白上述示例输入“从标准输入读取”是什么意思。

这是我编写的一个测试程序,可以消除我的困惑:

import java.io.*;
import java.util.Scanner;

class Test
{
public static void main(String[] args)
{   
    Scanner stdin = new Scanner(System.in);
    while(stdin.hasNextLine())
    {
        String line = stdin.nextLine();
        String[] tokens = line.split(" ");
        System.out.println(Integer.parseInt(tokens[1]));
    }
}

当我在控制台中运行这个程序时,它会等待我的输入,并且每次我输入一行时,它都会像我预期的那样回显它。所以我想也许上面的示例输入可以通过以这种方式输入 3 行中的每一行来实现。但是,似乎没有办法结束这个过程。输入3行后,如何终止输入?我尝试只按两次 enter,但这似乎读作仅包含换行符的行,这会导致错误,因为该行不符合预期的 2 标记格式。

控制台交互如下所示:

javac Test.java
java Test
one 1
1
two 2
2
three 3
3

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Test.main(Test.java:13)

如果能帮助我指出我的理解差距,我将不胜感激。

【问题讨论】:

    标签: java stdin java.util.scanner


    【解决方案1】:

    您可以尝试要求空输入

    import java.util.Scanner;
    
    public class Test
    {
        public static void main(String[] args)
        {   
            String line;
            Scanner stdin = new Scanner(System.in);
            while(stdin.hasNextLine() && !( line = stdin.nextLine() ).equals( "" ))
            {
                String[] tokens = line.split(" ");
                System.out.println(Integer.parseInt(tokens[1]));
            }
            stdin.close();
        }
    }
    
    • 您的代码即将完成。您所要做的就是退出 while 循环。在这个代码示例中,我向它添加了一个条件,首先将读取的输入值设置为 line,然后检查返回的 String 是否为空;如果是这样,while 循环的第二个条件返回 false 并让它停止。
    • 只有当您没有输入至少两个由空格分隔的值时,才会出现数组索引越界异常。如果您不尝试通过静态索引获取第二个值 >token[1]
    • 使用阅读器时,请记住在使用后关闭。
    • 最后但同样重要的是 - 您是否尝试过常用的 Ctrl+C 热键来终止控制台中的进程?

    祝你好运!

    【讨论】:

    • 至少在 Windows 上 Ctrl+C 会终止来自标准输入的输入。测试并验证它可以工作。文件重定向也以通常的方式工作。
    【解决方案2】:

    您也可以将您的值放在一个文件中,例如input.txt 并执行:

    java Test < input.txt
    

    【讨论】:

      【解决方案3】:

      在 shell 中,点击Ctrl-D,它将关闭标准输入。或者,管道输入

      cat your-input-file | java Test
      

      【讨论】:

        【解决方案4】:

        要停止输入,您可以提示用户输入 quit 退出,然后测试输入中是否存在该字符串,找到时退出循环,或者您可以在循环中使用计数器,退出达到最大迭代次数时的循环。 break 语句会让你跳出循环。

        【讨论】:

        • 感谢大家的回复。我没有按 Ctrl-D 或搜索“退出”来终止输入的选项,因为我正在提交给自动检查器 - 它需要上面的示例输入并且除了拒绝我之外没有给我反馈解决方案。自动化系统是否可以通过上述示例输入的格式检查“stdin”输入?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        相关资源
        最近更新 更多