如何使用Scanner停止从标准输入读取多行?

我正在处理一个JAVA赋值应处理多行输入。 指令读作“输入从标准输入读取”。

给出了一个示例输入示例:

one 1 two 2 three 3 

我不明白上面的示例输入“从stdin读取”是什么意思。

这是我写的一个测试程序,它隔离了我的困惑:

 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行后,如何终止输入? 我尝试按两次输入,但这似乎只是一个由换行符组成的行,这会导致错误,因为该行不符合它所期望的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) 

我非常感谢你指出我理解中的差距。

您可以尝试询问空输入

 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并让它停止。
  • 数组索引超出范围的exception只有当您没有输入最少两个值(由空格分隔)时才会获得。 如果您不想通过静态索引尝试获取第二个值> token [1] <,则可以避免此错误。
  • 当您使用读者时,请记住在使用它们后关闭它们。
  • 最后但并非最不重要的 – 您是否尝试过常用的Ctrl + C热键来终止控制台中的进程?

祝你好运!

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

 java Test < input.txt 

从shell中, 按Ctrl-D ,它将关闭stdin。 或者,管道输入

 cat your-input-file | java Test 

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