我绞尽脑汁想了解 Scanner 的工作原理已经有一段时间了。所以这是代码:
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String p = sc.nextLine();
System.out.println(s);
System.out.println(p);
System.out.println(sc.hasNextLine());
我的期望:
Love is good <- press ENTER
Love is blind <- press ENTER
Love is good <- output
Love is blind <- output
false
我拥有:
Love is good <- I press ENTER
Love is blind <- I press ENTER
Love is good <- output
Love is blind <- output
<- press ENTER
true <- output
我不明白的地方:
- 而不是立即打印这一行 - System.out.println(sc.hasNextLine()); - 它让我再次按下 ENTER 键
- 当没有更多的线条或符号时,它打印 true 而不是 false
我读过的内容:我已经阅读了很多关于在 nextInt() 之后使用 hasNextLine() 以及 nextInt() 如何不消耗 final 的 stackoverflow 答案符号,但我不明白为什么,即使我在这里不使用 nextInt(),我仍然需要再按一次 ENTER 以及为什么 hasNextLine() 为真。
最佳答案
像这样使用 BufferedReader
而不是 Scanner
:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Test {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
String p = reader.readLine();
System.out.println(s);
System.out.println(p);
System.out.println(reader.ready());
}
}
有关此事的更多信息,请查看 here和 here .根据经验,当您需要解析内容(如 nextInt
)时,请使用 Scanner
,否则请使用 BufferedReader
。 BufferedReader 也比 Scanner
快很多。
至于为什么会出现这种麻烦的行为,请参阅 javadoc对于扫描仪
。
适用于您的特定情况的部分是:
A scanning operation may block waiting for input.
在您的情况下,这意味着:在 Scanner
读取前两行之后,Scanner
正在等待输入,这是由其方法调用 引起的sc.hasNextLine()
。然后当 Enter 被击中时,它得到一个输入(因此它打印 true
,根据 docs 当有输入时它返回 true
) .在方法调用 sc.hasNextLine()
之后,您的程序中不再有可执行行,程序结束,给人一种它需要 两次 输入命中的错觉。 p>
关于java - 为什么 Java 要求我再次按下 Enter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34836931/