2

В моем коде, везде, где FileInputStream требуется в качестве аргумента, я делаю это:FileInputStream и закрытие

new obj(new FileInputStream(fileLocation)); 

Так как я не назначая FileInputStream к любой контрольной переменной, я не закрывая его, используя close() способ.

Это приводит к утечке памяти?

Не выделены ли ресурсы FileInputStream в вышеуказанном подходе?

+6

Если сам объект не закрывает поток, то да, у вас есть утечка ресурсов. – Kayaman

+1

Примечание: ** ресурс ** утечка, а не утечка памяти. – RealSkeptic

+0

Причина, по которой я задаю этот вопрос: с реализацией, упомянутой выше, я получил исключение FileNotFound (слишком много открытых файлов) после нескольких запусков. Мысль знать, является ли причина этой проблемы не закрытием потоков. – sujith

ответ

-1

Общий ответ здесь нет. Если все, что вы знаете об объекте, состоит в том, что это объект, то вы не можете предположить, что он закроет FileInputStream на своем собственном, и вы должны убедиться, что сами это обработаете; try-with-resources в Java7 делают это тривиальным.

try(FileInputStream fileStream =new FileInputStream(fileLocation);){ 
    Obj obj = new Obj(new obj(fileStream)); 
} catch (IOException ioe) { 
    //handle exception 
} 

С другой стороны, если вы знаете, что объект реализует интерфейс AutoClosable можно предположить, что FileInputStream будет закрыт, когда другой объект закрыт.

От Javadocs:

Замыкает этот ресурс, отказавшись любые основные ресурсы. Этот метод вызывается автоматически для объектов, управляемых оператором try-with-resources .

курсив мой

0

, если нет ссылки на ваш входной поток, он будет мусора и поток будет автоматически закрыт - см FileInputStream.finalize() метод. Однако это не хорошая практика программирования, потому что вы не знаете, когда произойдет сбор мусора. Таким образом, это может привести к утечке памяти.

Правильный и безопасный подход заключается в использовании try с помощью блока ресурсов или в старых версиях java try-catch-finally, где вы закрываете поток в блоке finally - мне лично нравится IOUtils из Apache Commons, вам не нужно уход за IOException брошен close() метод

+0

Завершение не происходит, как только объект собирает мусор. Сборщик мусора видит, что объект нуждается в завершении и очереди для его завершения. Сама финализация может не произойти, даже если сборка мусора приходит и уходит. Таким образом, никогда не бывает хорошей практики полагаться на «финализацию», и поэтому эта ситуация * считается утечкой ресурсов. – RealSkeptic