Я пытаюсь запустить простую эхо-программу из Java (используя ProcessBuilder
), существует бесконечный цикл, в котором я получаю ввод от пользователя (используя Scanner
). Затем я использую OutputStreamWriter
, чтобы записать его в стандартный поток процесса, и я ожидаю увидеть ту же строку, возвращаемую обратно через стандартный вывод, но этого не произойдет, если я не закрою поток (что я не хочу) или я пишу длинная строка ven при вызове 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 для отслеживания системных вызовов записи, и, похоже, мои предположения верны, сброс не работает, если это не длинная строка (или если вы не закрыли поток).
Edit 3/19: Я нашел это: Блокирует ли fgets () стандартный вывод, предотвращая printf , что делает вещи еще более интересными.