Findbugs «Метод может не закрыться» при использовании getResourceAsStream - PullRequest
3 голосов
/ 28 июля 2010

Если у меня в сервлете следующий код:

Properties p = new Properties();
p.load(getClass().getResourceAsStream("/test.properties"));

Если я запускаю сервлет через FindBugs, я ожидаю получить предупреждение OS_OPEN_STREAM , но я не получаю. Если я использую аналогичный подход для открытия произвольного файла в файловой системе (т.е. не в пути к классам), я получаю предупреждение Findbugs, как и ожидалось:

Properties p = new Properties();
p.load(new FileInputStream(new File("c:/test.properties")));

В первом примере отсутствует предупреждение, потому что Findbugs отсутствует действительное предупреждение (т.е. я должен закрывать поток в блоке finally после загрузки в объект Properties) или есть причина, по которой мне не нужно закрывать поток?

Спасибо

Рич

1 Ответ

7 голосов
/ 28 июля 2010

Посмотрите описание предупреждения:

Метод создает объект потока ввода-вывода, не назначая его никаким полям ...

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

Обратите внимание, что загрузчик классов может реализовать getResourceAsStream() таким образом, что не требуется закрывать поток (т.е.копирование ресурса в память и возврат ByteArrayInputStream).Но для общего случая URLClassLoader загрузки классов из каталога закрытие потока действительно необходимо, чтобы избежать утечки файловых дескрипторов.

...