gpt4 book ai didi

java - 如何强制java OutputStreamWriter实际写入单个字节?

转载 作者:行者123 更新时间:2023-11-30 05:43:44 24 4
gpt4 key购买 nike

我正在尝试从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这让事情变得更加有趣。

最佳答案

问题出在与a.exe的交互中。

a.exe 使用fgets。当读取 (n-1) 个字符、读取换行符或到达文件末尾(以先到者为准)时,它会停止。

您不会将新行推送到 a.exe,因此 fgets 只能以 EOF 完成,这在您关闭流时发生。

您可以从 Java 推送行尾,也可以在 C 端使用另一个读取函数。

要推送行尾,您可以使用:

writer.write(System.lineSeparator());

参见:https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

关于java - 如何强制java OutputStreamWriter实际写入单个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55209129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com