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

2022-09-01 19:20:24

喜欢标题;关闭 a 是否会关闭基础文件流?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

答案是“是的”,但Javadoc中没有任何东西是这么说的。原因是它本身是一个抽象类,其具体实现提供了关闭底层FD的方法。但是,由于该体系结构和受保护的事实,这不会被记录下来。FileChannelimplCloseChannel()implCloseChannel()


答案 2

推荐