Java 如何正确关闭从FileOutputStream获取的FileChannel

Java 如何正确关闭从FileOutputStream获取的FileChannel,java,eclipse,nio,eclipse-juno,Java,Eclipse,Nio,Eclipse Juno,我刚刚在当前的Eclipe Juno候选版本中打开了一些旧代码,并注意到一个闪亮的新警告:资源泄漏。它是由如下代码触发的: FileChannel out = new FileOutputStream(file).getChannel(); try { ...Do something with out... } finally { out.close(); } FileOutputStream outStream = new FileOutputStream(file); tr

我刚刚在当前的Eclipe Juno候选版本中打开了一些旧代码,并注意到一个闪亮的新警告:资源泄漏。它是由如下代码触发的:

FileChannel out = new FileOutputStream(file).getChannel();
try
{
    ...Do something with out...
}
finally
{
    out.close();
}
FileOutputStream outStream = new FileOutputStream(file);
try
{
    FileChannel out = outStream.getChannel();
    try
    {
        ...Do something with out...
    }
    finally
    {
        out.close();
    }
}
finally
{
    outStream.close();
}
Eclipse认为创建的文件输出流是一个资源泄漏。实际上,我不确定这是否是一个错误的警告(FileChannel的close方法也不关闭流),或者这是否真的是一个资源泄漏。我将代码更改为:

FileOutputStream outStream = new FileOutputStream(file);
try
{
    FileChannel out = outStream.getChannel();
    ...Do something with out...
}
finally
{
    outStream.close();
}
警告现在消失了,但我不确定是否必须调用FileChannel的close方法。所以也许它看起来应该是这样的:

FileChannel out = new FileOutputStream(file).getChannel();
try
{
    ...Do something with out...
}
finally
{
    out.close();
}
FileOutputStream outStream = new FileOutputStream(file);
try
{
    FileChannel out = outStream.getChannel();
    try
    {
        ...Do something with out...
    }
    finally
    {
        out.close();
    }
}
finally
{
    outStream.close();
}
如果使用一个文件输入通道和一个文件输出通道,那么这将导致四个嵌套的try…finally块,所有这些都会变得有点臃肿


你觉得怎么样?是否真的有必要关闭通道和溪流?还是关闭流就足够了?

啊,在FileOutputStream的close()方法的文档中找到了答案:

If this stream has an associated channel then the channel is closed as well.
因此,关闭流就足够了