Как правильно управлять 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();
}

Чтобы узнать больше, прочитайте:

Другие вопросы по тегам