2010-03-05 3 views
1

я заметил в программе Java ниже линии используется, чтобы открыть файл и обработать егоЧто касается Java-файла закрытия

BufferedReader inp = new BufferedReader(new FileReader(inputFile)); 

В javaprogram ИЯФ не закрывается перед выходом из программы ниже линии недостающую

if (inp != null) 
    try { 
     inp.close(); 
    } catch (IOException logOrIgnore) {} 

Программа имеет выходы в большом количестве, но они не закрыли файл. Нужно ли мне всю эту линию ставить? Если я не закрою файл, когда программа выйдет, это будет проблемой. Закрывает ли сборщик мусора файл?

+0

- BufferedReader передается другим методам или используется только в одном месте? –

+0

Что значит «программа имеет выходы во многих местах»? Завершает ли программа использование System.exit()? Если это так, то попытка try/finally не будет работать. – Rahul

+0

В отношении связанной заметки, я иногда очень хочу, чтобы Java «использовала» (a la C#). Он позволяет детерминировать удаление с гораздо меньшим количеством помех кода и поощряет The Right Thing. –

ответ

3

Вы должны использовать try/finally:

Reader inp = new BufferedReader(new FileReader(inputFile)); 
try { 
    // Do stuff with "inp" 
} finally { 
    IOUtils.closeQuietly(inp); 
} 

IOUtils от Apache Commons IO. Его метод closeQuietly походит на ваш фрагмент кода выше: он вызывает close и игнорирует любые выброшенные исключения.

+0

Большое спасибо за информацию. – Arav

0

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

+0

function() { BufferedReader inp = new BufferedReader (новый FileReader (inputFile)); } Поскольку он определен внутри функции объекта, он не будет автоматически уничтожен после выхода из функции? Будет ли это проблемой, если я его не закрою? – Arav

+2

Сборщик мусора * делает * закрывает файл, но нет гарантии, что он когда-либо будет выполнен. ОС также закроет файл, когда процесс завершится. Для входных файлов это достаточно хорошо. Для выходных файлов с буферами в прикладном пространстве, таких как BufferedOutputStream, BufferedWriter, ObjectOutputStream, PrintStream, PrintWriter, это не так. – EJP

+0

@EJP: Нет ничего в javadoc для FileReader или BufferedReader, который говорит, что он будет закрыт автоматически. Оба они имеют метод explict close(). Они оба наследуют finalize() от Object, поэтому я не вижу, как может произойти что-то конкретное для читателя, когда объект GC'd. (Вы, конечно, правильно, что ОС закроет файл, когда процесс завершит работу.) –

0

Похоже, вы используете BufferedReader, не возвращаясь к контексту, в котором он был объявлен (возможно, переменная экземпляра?). В этом случае вы должны закрыть его вручную при каждом возможном выходе из приложения. Вы не можете полагаться на сборщика мусора, чтобы сделать это за вас.

+0

function() {BufferedReader inp = new BufferedReader (новый FileReader (inputFile)); } Поскольку он определен внутри функции объекта, он не будет автоматически уничтожен после выхода из функции? Будет ли это проблемой, если я его не закрою? – Arav

+0

@arav: В итоге он получит мусор (возможно, скоро, но никаких гарантий безотказной работы), но это не произойдет сразу же при выходе функции. Подход try/finally позволяет закрыть файл в точности, когда вы ожидаете, что это произойдет («детерминированное удаление»). –

+0

@arav: Что касается проблемы, если вы не закрываете ее явно, если вы вызываете эту функцию слишком много раз, прежде чем сборщик мусора может завершить работу ваших читателей, тогда у вас закончится доступный дескриптор файла и больше не откроется (пока некоторые существующие дескрипторы файлов не будут закрыты). –

Смежные вопросы