Закрытие BufferedWriter
закроет лежащие в его основе потоки, в том числе процесс OutputStream
, который вы получаете через process.getOutputStream()
.Таким образом, как только он будет закрыт в одном цикле, в следующих циклах у вас будет BufferedWriter
, оборачивающий закрытый поток.Вместо этого оберните выходной поток только один раз и используйте его повторно.
Пример:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
// while the stream is open and there is something to read
// probably a better condition than `process.isAlive()`
while ((line = br.readLine()) != null) {
switch (line) {
case "What is your name?":
bw.write("John Doe");
bw.newLine();
bw.flush();
break;
case "What is your contact number?":
bw.write("123456789");
bw.newLine();
bw.flush();
break;
}
}
Причина, по которой исходный код умер на close()
, а не на write()
, которыйпредшествовал этому, когда ваш новый BufferedWriter
упаковывал закрытый базовый поток, потому что BufferedOutputStream.write()
может еще не записывать в базовый поток, так как он буферизован.Вызов flush()
должен указать потоку на фактическую запись, и, как вы видите в трассировке стека, close()
вызывает flush()
, который в конечном итоге записывает буферизованные байты в базовый FileOutputStream
, который затем осознает, что FileOutputStream
уже закрыт.