Должен ли я всегда закрывать BufferedReader? - PullRequest
0 голосов
/ 26 февраля 2019

Вот строка, считывающая файл в List:

List<String> lines =
    new BufferedReader(
        new InputStreamReader(classLoader.getResourceAsStream(fileName)))
            .lines()
            .collect(Collectors.toList());

Это правильно, или я должен присвоить BufferedReader переменной, чтобы иметь возможность закрыть ее позже?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вы всегда должны закрывать свои ресурсы.Закрытие может не быть большой проблемой для небольших программ, которые быстро используют только пару файлов, так как большинство зрелых ОС закрывают файлы для вас после завершения процесса.Однако обычно есть ограничения на количество файлов, которые вы можете открыть одновременно.Хорошо быть аккуратным, чтобы вы не выходили за эти пределы, когда начинаете писать большие программы.Существуют также другие типы ресурсов, такие как сетевые и последовательные порты, которые вы можете разрешить другим использовать после завершения работы с ними, даже если она все еще работает.

Альтернатива закрытию файла вручнуюиспользует синтаксис try-with-resources , который обеспечивает корректное закрытие файла даже в случае ошибки:

List<String> lines;
try(BufferedReader reader = new BufferedReader(
        new InputStreamReader(classLoader.getResourceAsStream(fileName)))) {
    lines = reader.lines().collect(Collectors.toList());
}
0 голосов
/ 26 февраля 2019

Я исправлен


Из документации: Потоки имеют метод close () и реализуют интерфейс AutoCloseable , но почтивсе экземпляры потоков фактически не нужно закрывать после использования.

Как правило, только потоки, источником которых является канал ввода-вывода, например BufferedReader.lines , требуют закрытия.

Большинство потоков поддерживаются коллекциями, массивами или генерирующими функциями, которые не требуют специального управления ресурсами. Если поток требует закрытия, он может быть объявлен как ресурс в инструкции try-with-resources.

0 голосов
/ 26 февраля 2019

Ну, в вашем конкретном примере поток, открытый с помощью

classLoader.getResourceAsStream(fileName)

, никогда не закрывается.Этот поток должен быть закрыт - это, скорее всего, дескриптор файла в локальной системе.Вы можете закрыть его, закрыв BufferedReader, который закрывает завернутый InputStreamReader, который закрывает базовый InputStream.Вместо этого вы могли бы также сохранить ссылку на исходный InputStream и только закрыть ее.

Пожалуйста, обратите также внимание на try-with-resources , это потенциально может упростить вам задачуздесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...