Как правильно управлять OutputStream, чтобы избежать ошибок утечки ресурсов
Я застрял с этой проблемой некоторое время, я прочитал некоторые учебные пособия и документацию о том, как реализовать переменную inputStream и ее жизненный цикл, тем не менее, я снова и снова сталкиваюсь с той же ошибкой, отмеченной статическим анализатором Infer из Facebook, Это наводит на мысль, что в этом коде есть проблема: RESOURCE_LEAK:
File file = new File(PATH_PROFILE + UserHelper.getInstance().getUser().getId() + ".jpg");
OutputStream os = null;
try {
os = new FileOutputStream(file);
os.write(dataBytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Ошибка описания:
ошибка: ресурс типа RESOURCE_LEAK java.io.FileOutputStream
приобретено по вызову FileOutputStream(...)
в строке 494 не освобождается после строки 499.
Но я отпускаю его в блоке finally, это ложная ошибка тревоги? или я что-то упустил? потому что я был в этом в течение некоторого времени, и я не могу получить, где ошибка.
Я очень благодарен за вашу помощь и поддержку.
1 ответ
Используйте try-with-resources (доступно с Java 7).
File file = new File(PATH_PROFILE + UserHelper.getInstance().getUser().getId() + ".jpg");
try (OutputStream os = new FileOutputStream(file)) {
os.write(dataBytes);
} catch (Exception e) {
e.printStackTrace();
}
Чтобы узнать больше, прочитайте:
- Учебные руководства по Java™: заявление об использовании ресурсов
- Замечания к выпуску Java 7: оператор try-with-resources