Подтвердить что ты не робот

Правильное закрытие Java Process InputStream из getInputStream

Я не могу найти это в документации. Но когда мы имеем объект Process и вызываем getInputStream(),

Получается ли новый поток, который мы должны явно закрыть, когда мы с ним закончим? или мы получаем поток, который уже существует, связанный с процессом, который мы не должны закрывать, но процесс позаботится о его закрытии?

В принципе, как мы должны взаимодействовать с потоком, который мы получаем из Process.getInputStream()? закрыть или не закрыть?

4b9b3361

Ответ 1

Мои первые реакции заключались в том, чтобы закрыть его, вы всегда закрываете потоки, которые вы открываете. Я действительно понимаю, что документация не в порядке, но поскольку они явно не заявляют, что не закрывают, что для меня означает следовать хорошей практике программирования.

InputStream is = process.getInputStream()
try {
    // your code
} finally {
    try { is.close(); } catch (Exception ignore) {}
}

Если вам нужно убедиться, что это не проблема, просто напишите быстрый тестовый пример, где вы отлично от входного потока несколько десятков раз, каждый раз открывая и закрывая InputStream.

Ответ 2

Когда вы вызываете Process.getInputStream(), вы получаете существующий поток ввода, который был настроен для процесса. Когда процесс умирает, этот входной поток не исчезает автоматически - подумайте об этом как о буфере, о котором вы все еще можете прочитать. Окончание процесса трубы может быть закрыто, но на вашем конце нет. Вы несете ответственность за его закрытие, хотя GC в конечном итоге получит его.

Вы также должны закрыть другие два: getErrorStream() и getOutputStream().

Ответ 3

Из чтения UNIXProcess.java это происходит:

Нам нужно различать два состояния: либо процесс все еще жив, либо он мертв.

Если процесс жив, закрывая OutputStream (переходит в stdin процесса), вы сообщаете процессу, что для него больше нет ввода. Закрывая InputStreams (stdout, stderr процесса), процесс больше не должен записывать их (он будет получать SIGPIPE, если он пытается).

Когда процесс умирает, Java будет буферизовать оставшиеся данные из stdout/stderr и закрыть все три потока для вас (он запускает поток "process reaper", который уведомляется о смерти процесса). Любая попытка записи в OutputStream завершится с ошибкой. Чтение из InputStream приведет к возврату буферизованных данных, если они есть. Закрытие любого из них не имеет никакой пользы, но также не причиняет вреда. (К этому времени закрываются дескрипторы файловой системы.

Ответ 4

Я всегда их закрываю! Я не уверен на 100%, но насколько я знаю, если вы оставите входной поток открытым, файл будет открыт, пока вы его не закроете!! Поэтому следуйте "стандартным правилам" и закройте его! следуйте примеру: Задача процесса Builder waitFor() и ограничения Open file

Ответ 5

или мы получаем поток, который уже существует, связанный с Процесс, который мы не должны закрывать, но Процесс позаботится о закрытие?

Нет Javadoc, который так говорит, есть?

Ответ 6

Вы не закрываете потоки, которые вы не открывали - это неприятный побочный эффект. Если вы создали этот процесс, сначала уничтожьте его и закройте потоки.