java - 热腾腾的 java --- 使用 bash 中的 java 处理标准输入时的一些奇怪行为
问题描述
main
假设我有以下(愚蠢的)java程序,它在和之间来回循环aux
,每当y
输入a时:
import java.util.Scanner;
public class Minimal {
public static void main(String[] args) {
System.out.println("in main...");
Scanner scanner = new Scanner(System.in);
String s;
while(scanner.hasNextLine()) {
s = scanner.nextLine();
System.out.println(s);
if(s.equals("y")) {
aux();
System.out.println("in main...");
}
}
}
public static void aux() {
System.out.println("in aux...");
Scanner scanner = new Scanner(System.in);
String s;
while(scanner.hasNextLine()) {
s = scanner.nextLine();
System.out.println(s);
if(s.equals("y")) {
return;
}
}
}
}
但是,当我跑步时
$ javac Minimal.java
$ printf "y\ny\ny\ny\ny\ny\ny\n" | java Minimal
在 bash 中,我得到的答案与运行时不同
$ java Minimal
并键入(交互式)y
后跟<ENTER>
--- 似乎等同于上面自动输入的内容printf
。有任何想法吗?
解决方案
不同之处在于缓冲。 Scanner
缓冲其输入,因此它可能一次消耗多行来自System.in
. 使用printf
时,数据立即可用,因此全部Scanner
由main()
. 因此,没有更多数据可供Scanner
在每次调用中创建的aux()
读取。
当您以交互方式运行程序时,终端会在您输入数据时逐行发送数据,因此在每次读取时没有任何额外的数据可用于缓冲。
为避免此问题,请不要Scanner
为同一个InputStream
.
推荐阅读
- c# - FlowListView 列间距
- c++ - 无法构造具有给定数据类型的 Multimap
- playframework - Play Framework 将 val 放入 Action Builder Scala
- angular - 自定义指令中的抽象离开传单指令
- sql - 如果日期之间没有订单,Oracle SQL 返回 0 计数
- tensorflow - 什么 ImagePairData 层在 Caffe 中意味着什么?
- javascript - 读取从特定端口接收到的数据 C#
- c - 如何从每一行的文件中读取数据并将其存储到结构数组中
- sapui5 - 如何在 Fiori App 中更改 shell 标题
- java - 12 位非主键的可变前后缀和自动递增后缀,jpa 生成器