24

就像标题一样;是否关闭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();
    }
}

...我让溪流保持开放?

4

1 回答 1

20

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

于 2012-10-19T08:58:27.090 回答