Что произойдет, если я не закрою FileInputStream в JAVA? [Дубликат]

7
задан Sree Karthik S R 22 October 2015 в 07:47
поделиться

6 ответов

Я не думаю, что спецификация JVM дает какие-то гарантии об этом. Вы действительно должны finally закрыть эти ресурсы.

Когда процесс завершится, операционная система освободит все связанные с ней ресурсы (включая память, дескрипторы файлов и сетевые сокеты).

Есть объекты ОС для проверки открытых файлов и потоков, таких как lsof .

11
ответ дан Thilo 25 August 2018 в 20:05
поделиться

Нет гарантии, что ресурсы будут закрыты до тех пор, пока работает JVM, ваша предлагаемая реализация довольно опасна.

Что я хотел бы предложить. Сделайте класс A закрытым и используйте tryResourceClose-Statement Java. Пример здесь. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

После выхода из блока try вы получаете возможность закрыть свои ресурсы.

Сам поток обычно не знает, открыта ли она или нет. Тем не менее, ваш собственный класс A может отслеживать, что потоки были закрыты или нет.

1
ответ дан Jordi Laforge 25 August 2018 в 20:05
поделиться

В случае FileInputStream существует метод finalize(), который освободит ресурсы, когда поток будет собран мусором.

Не то, чтобы вы могли или должны полагаться на это. Это то, что делает FileInputStream. SocketInputStream с другой стороны переопределяет finalize(), чтобы явно ничего не делать, полагаясь на Socket, чтобы закрыть ресурсы (и Socket не имеет метода finalize()).

3
ответ дан Kayaman 25 August 2018 в 20:05
поделиться

Это плохая практика программирования, ошибка программиста. В зависимости от исходного источника данных он может никогда не закрыться, и у вас могут быть утечки. Вы должны закрыть любой ресурс, когда закончите с ним, в блоке finally или используете попытку с ресурсами, если Java 7 или выше, чтобы убедиться, что он закрыт, даже если выбрано исключение.

InputStream in;
OutputStream out;
try {
   // Do your stuff with the streams
} finally {
   if (in != null) {
       in.close();
   }
   if (out != null) {
       out.close();
   }
}
0
ответ дан m0skit0 25 August 2018 в 20:05
поделиться

Если вы не клонируете его вручную, тогда все неуправляемые ресурсы будут освобождены, когда процесс завершится, но это не рекомендуется или лучше. Вы всегда должны закрыть свой поток, как только вы закончите с ним.

Лучшим и предлагаемым способом управления потоком является использование опции try с ресурсом, например:

try (InputStream input = new FileInputStream(...);
     Reader reader = new InputStreamReader(input, ...)) {
   ...
}

Я не закрывал потоки. Будет ли он автоматически закрываться после завершения задания ссылки на класс A?

Нет, он не будет закрываться автоматически.

Хорошая ссылка на следующее:

Улучшение управления ресурсами с помощью Java SE 7: Вне синтаксического сахара

4
ответ дан Rahul Tripathi 25 August 2018 в 20:05
поделиться

С помощью Java 7 вы можете создать один или несколько «ресурсов» в заявлении try. «Ресурсы» - это то, что реализует интерфейс java.lang.AutoCloseable. Этот ресурс будет автоматически закрыт и конец блока try.

вы можете посмотреть этот и java doc для получения дополнительной информации

private static void printFileJava7() throws IOException {

    try(FileInputStream input = new FileInputStream("file.txt")) {

        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    }
}

Когда блок try заканчивается, FileInputStream будет автоматически закрыт. Это возможно, потому что FileInputStream реализует интерфейс Java java.lang.AutoCloseable. Все классы, реализующие этот интерфейс, могут быть использованы внутри конструкции try-with-resources.

0
ответ дан smac89 25 August 2018 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: