FileChannel.close()是否关闭底层流?

时间:2012-10-19 08:39:35

标签: java nio

喜欢标题;关闭FileChannel是否会关闭基础文件流?


您可以阅读AbstractInterruptibleChannel.close() API文档:

  

关闭此频道。

     

如果频道已关闭,则此方法返回   立即。否则,它会将通道标记为已关闭,然后调用   implCloseChannel方法,以完成关闭操作。

调用AbstractInterruptibleChannel.implCloseChannel

  

关闭此频道。

     

close方法调用此方法以执行   关闭频道的实际工作。只有在调用此方法时才会调用此方法   频道尚未关闭,它永远不会被调用   一次。

     

此方法的实现必须安排任何其他线程   在此通道返回时在I / O操作中被阻止   立即,通过抛出异常或正常返回。

这并没有说明流。事实上,当我这样做时:

public static void copyFile(File from, File to) 
        throws IOException, FileNotFoundException {

    FileChannel sc = null;
    FileChannel dc = null;

    try {
        to.createNewFile();

        sc = new FileInputStream(from).getChannel(); 
        dc = new FileOutputStream(to).getChannel();

        long pos = 0;
        long total = sc.size();
        while (pos < total)
            pos += dc.transferFrom(sc, pos, total - pos);

    } finally {
        if (sc != null) 
            sc.close();
        if (dc != null) 
            dc.close();
    }
}

......我把溪流打开了?

1 个答案:

答案 0 :(得分:18)

答案是“是”,但Javadoc中没有任何内容实际上是这样说的。原因是FileChannel本身是一个抽象类,其具体实现提供了implCloseChannel()方法,它关闭了底层FD。但是,由于该体系结构以及implCloseChannel()受到保护的事实,因此无法记录。