2012-06-15 3 views
4

Я только что открыл какой-то старый код в текущем кандидате на выпуск Eclipe Juno и заметил блестящее новое предупреждение: утечка ресурсов. Он был вызван следующим кодом:Как правильно закрыть FileChannel, полученный из FileOutputStream

FileChannel out = new FileOutputStream(file).getChannel(); 
try 
{ 
    ...Do something with out... 
} 
finally 
{ 
    out.close(); 
} 

Eclipse считает, что созданный поток вывода файла является утечкой ресурсов. На самом деле я не уверен, что это ложное предупреждение (и метод close FileChannel также не закрывает поток), или если это действительно утечка ресурсов. Я изменил код так:

FileOutputStream outStream = new FileOutputStream(file); 
try 
{ 
    FileChannel out = outStream.getChannel(); 
    ...Do something with out... 
} 
finally 
{ 
    outStream.close(); 
} 

предупреждения уже нет, но теперь я не уверен, если близкий метод FileChannel должен быть вызван. Так, может быть, он должен выглядеть следующим образом:

FileOutputStream outStream = new FileOutputStream(file); 
try 
{ 
    FileChannel out = outStream.getChannel(); 
    try 
    { 
     ...Do something with out... 
    } 
    finally 
    { 
     out.close(); 
    } 
} 
finally 
{ 
    outStream.close(); 
} 

При использовании входного канала файла и выходной канала файла, то это приводит к четырем вложенным попробовать ... наконец блоки, и все это получает вид раздутые.

Как вы думаете? Действительно ли необходимо закрыть канал И поток? Или закрывает поток достаточно?

ответ

9

Ах, нашел ответ в документации метода Close() из FileOutputStream:

If this stream has an associated channel then the channel is closed as well. 

Так закрытие потока достаточно.