【发布时间】:2019-03-17 16:14:26
【问题描述】:
我正在尝试从 Java 运行一个简单的 echo 程序(使用 ProcessBuilder),有一个无限循环,我从用户那里获取输入(使用 Scanner)。然后我使用OutputStreamWriter 将其写入进程的标准输入,我希望看到相同的字符串通过标准输出回显,但除非我关闭流(我不想这样做)或者我写一个长字符串。即使在调用flush时,如果字符串很短(比如,1个字符)它也不起作用。
我们如何强制刷新,即使是单字符(短)字符串?
ProcessBuilder pb = new ProcessBuilder(cmd);
Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
OutputStream stdin = p.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(stdin);
Scanner scanner = new Scanner(System.in);
String line;
while (true) {
String input = scanner.nextLine();
if (input.equals("q"))
break;
writer.write(input+"\n");
writer.flush();
// writer.close(); (uncommenting this makes it work once, then throw error)
line = br.readLine();
System.out.println(line);
}
编辑 3/18:我已经尝试过 Windows sysinternals 工具来跟踪写入系统调用,看起来我的猜测确实是正确的,除非它是一个长字符串(或者除非你关闭流),否则刷新不起作用。
编辑 3/19:我发现了这个:Does fgets() locks stdout preventing printf,这让事情变得更加有趣。
【问题讨论】:
-
cmd变量中有什么内容? -
{a.exe}:它是一个程序,它只会回显你输入的任何内容。 (while(1){ fgets(buf, MAX, stdin); printf("string is: %s", buf); })
标签: java io outputstream