Нужно ли закрывать локальныеIO-потоки в Java

152
22 ноября 2021, 19:20

Если поток был создан локально, обязательно ли его закрывать в конце метода?

public void method() {
    FileInputStream fis = new FileInputStream("input.txt");
    ...
    fis.close(); //Необходимо ли это?
}
Answer 1

Обязательно. При создании объект открывается для чтения и система должна знать, когда ресурс станет опять свободным. Также, в случае, если поток окажется не закрыт, может происходить утечка памяти.

Answer 2

Да, нужно закрывать, чтобы не было утечки памяти. Закрывая мы говорим сборщику мусора, что объект можно убирать. Если не хочется закрывать вручную, есть альтернатива: try-с-ресурсами:

try (FileInputStream fis = new FileInputStream("input.txt")) {
        //тут что-то делать с fis.
} catch(IOException e) {
        // обработка исключений
} finally {
        // финализация чего-либо
}

FileInputStream будет закрыт автоматически. В самом простом случае от finally можно отказаться совсем.

Answer 3

Leonis дело говорит. Причем крайне рекомендуется использовать именно try-с-ресурсами (при Java 7 и выше) вместо закрытия вручную в блоке finally

READ ALSO
Почему не устанавливаются поля объекту через SELECT запрос к MySQL в Java

Почему не устанавливаются поля объекту через SELECT запрос к MySQL в Java

Ошибок никаких не выдаёт, просто возвращает nullQuery, посылаемый в базу данных, предполагается в виде Query = "SELECT * FROM users WHERE Login = "Login" AND Password = 12345;

73
Обрабатывать открываемый файл в Android Java

Обрабатывать открываемый файл в Android Java

Я разрабатываю свой редактор Web-кода и хочу чтобы при нажатии на определённый файл (а именно html, js, css и txt) открывался редактор (MainActivity) и в EditText...

70
Как получить объект с form (spring + thymeleaf)

Как получить объект с form (spring + thymeleaf)

Подскажите пожалуйста, что делаю неправильноПри запуске программы и ввода данных в форму, в debug значения имени и пароля пустые(фото ниже)

217