Из прочтения UNIXProcess.java вот что происходит:
Нам нужно различать два состояния: либо процесс еще жив, либо он мертв.
Если процесс живзакрывая OutputStream (переходит к стандартному вводу процесса), вы сообщаете процессу, что для него больше нет входных данных.Закрывая InputStreams (stdout, stderr процесса), процесс больше не может записывать в них (он получит SIGPIPE, если попытается).
Когда процесс умирает, Java буферизирует оставшиеся данные из stdout / stderr,и закройте для вас все три потока (на нем запущен поток «Process Reaper», который уведомляется о смерти процесса).Любая попытка записи в OutputStream не удастся.Чтение из InputStream вернет буферизованные данные, если они есть.Закрытие любого из них не приносит никакой пользы, но также не приносит вреда.(Базовые дескрипторы файлов к этому времени закрыты).