FindBugs: «возможно, не удастся закрыть поток» - это действительно в случае InputStream? - PullRequest
3 голосов
/ 03 апреля 2010

В моем Java-коде я запускаю новый процесс, затем получаю входной поток для его чтения:

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

FindBugs сообщает об ошибке здесь:

may fail to close stream
Pattern id: OS_OPEN_STREAM, type: OS, category: BAD_PRACTICE

Должен ли я закрыть InputStream другого процесса? Более того, согласно его Javadoc , InputStream # close () ничего не делает. Так это ложное срабатывание или мне действительно нужно закрыть входной поток процесса, когда я закончу?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2010

В этом случае вы хотите close() Reader, который закроет основные потоки. Да, всегда полезно закрывать потоки, даже если в данный момент вы знаете, что реализация, на которую вы смотрите, ничего не делает (хотя, на самом деле, она здесь!) Что если это изменится позже?

FindBugs только для предупреждения о возможных ошибках; это не всегда может знать наверняка.

Наконец, да, ваш Java-процесс владеет процессом и Process объектом, который вы породили. Вы определенно должны закрыть это и выходной поток. Никто другой не использует их, и важно делать такие вещи, чтобы избежать забавного потока, связанного с ОС.

3 голосов
/ 03 апреля 2010

InputStream является абстрактным классом - то, что его реализация ничего не делает, не означает, что фактический тип объекта, возвращаемый process.getInputStream(), не делает.

Возможно, что закрытие входного потока в данном конкретном случае не принесло бы вреда, но я лично на это не рассчитывал. Закройте его, как если бы вы закрыли любой другой поток ввода. Помимо всего прочего, это делает ваш код более надежным в случае, если вы когда-нибудь решите изменить его для чтения из чего-то другого - вместо этого было бы слишком легко (скажем) читать из файла, и не замечать, что вы не закрываете FileInputStream.

0 голосов
/ 03 апреля 2010

Я думаю, что всегда полезно закрывать все потоки, которые вы открываете. Предпочтительно в блоке finally {}. Поскольку он ничего не делает, как говорит Java, почему бы не вызвать метод close (). Ничего страшного.

...