Как правильно закрыть FileChannel, полученный из FileOutputStream

Я только что открыл какой-то старый код в текущей версии Eclipe Juno Release Candidate и заметил новое блестящее предупреждение: Утечка ресурсов. Это было вызвано таким кодом:

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();
}

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

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


person kayahr    schedule 15.06.2012    source источник


Ответы (1)


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

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

Поэтому достаточно закрыть поток.

person kayahr    schedule 15.06.2012