Да ты прав.
Сборка мусора освобождает кучу Java (память), но close() освобождает ресурсы ОС, используемые для открытия файла (количество открытых файлов ограничено в большинстве систем), и гарантирует, что данные действительно записываются.
Но многие классы, такие как FileInputStream
и RandomAccessFile
, написаны с использованием метода finalize(), который гарантирует, что ЕСЛИ экземпляр в собранном мусоре, close() будет вызываться первым. Таким образом, во многих случаях сборка мусора косвенно освобождает файлы, и программисты часто могут лениться закрывать ресурсы, потому что сборка мусора обычно очищает их за вас. К сожалению.
Проблема в том, что вы не можете контролировать, когда это происходит, а может и не произойти вовсе. Поэтому, если у вас открыто слишком много файлов, операционная система может выдать вам сообщение об этом до того, как сборщик мусора успеет их закрыть. Или, если вы хотите переместить файл или удалить его, сразу после его чтения - перемещение или удаление может завершиться неудачей, потому что в этот момент файл все еще открыт для чтения.
Подобные ошибки часто сложно надежно воспроизвести, потому что они зависят от времени работы сборщика мусора. Таким образом, вы получаете вещи, которые обычно работают нормально, но иногда загадочным образом дают сбой. Очень раздражает отладка. По этой причине настоятельно рекомендуется обязательно закрыть() любой поток/читатель/соединение или другой закрываемый ресурс, который вы можете использовать, как только вы закончите с ним. Предпочтительно в блоке finally, чтобы гарантировать, что это произойдет, даже если при обработке произойдет какая-то другая ошибка.
А с Java 7 добавлен интерфейс AutoClosable
, подробнее об этом читайте здесь.
Ссылка: http://www.coderanch.com/t/278165//java/InputStream-close-garbage-collection
person
Amar
schedule
29.08.2013