Как найти незанятые ресурсы ввода-вывода в Java?
Многие ресурсы ввода-вывода в Java, такие как InputStream и OutputStream, должны быть закрыты, когда они завершены, как обсуждалось здесь.
Как я могу выполнить поиск в моем проекте для мест, где такие ресурсы не закрываются, например. такая ошибка:
private void readFile(File file) throws IOException {
InputStream in = new FileInputStream(file);
int nextByte = in.read();
while (nextByte != -1) {
// Do something with the byte here
// ...
// Read the next byte
nextByte = in.read();
}
// Oops! Not closing the InputStream
}
Я пробовал некоторые инструменты статического анализа, такие как PMD и FindBugs, но они не помещают вышеуказанный код как неправильный.
Ответы
Ответ 1
Если FindBugs с измененными правилами не работает для вас, другой более медленный подход - это анализ кучи. VisualVM позволяет запрашивать все объекты определенного типа, которые открыты в любой момент времени в дампе кучи, используя OQL. Затем вы можете проверить, открыты ли потоки для файлов, которые не должны быть доступны в этой точке программы.
Запуск выполняется так же просто, как:
%>jvisualvm
Выберите выполняемый процесс. Выберите вариант save heap dump (или что-то в этом роде), откройте кучу кучи и посмотрите экземпляры классов для потоков файлов в браузере или запросите их.
Ответ 2
Вероятно, это вопрос настройки . Я запустил FindBugs через мой плагин IDE и сообщил OS_OPEN_STREAM.
Ответ 3
В Java 7 они добавили функцию использования закрываемых ресурсов в текущей области (так называемые try-with-resources), например:
public void someMethod() {
try(InputStream is = new FileInputStream(file)) {
//do something here
} // the stream is closed here
}
В старых версиях общий метод использует цепочку try-catch-finally.