24

タイトルのように; FileChannel閉じると、基になるファイルストリームが閉じますか?


APIドキュメントから次のようにAbstractInterruptibleChannel.close()読むことができます。

このチャンネルを閉じます。

チャネルがすでに閉じられている場合、このメソッドはすぐに戻ります。implCloseChannelそれ以外の場合は、チャネルを閉じているとマークしてから、閉じる操作を完了するためにメソッドを呼び出します。

呼び出すAbstractInterruptibleChannel.implCloseChannel

このチャンネルを閉じます。

このメソッドは、チャネルを閉じる実際の作業を実行するために、closeメソッドによって呼び出されます。このメソッドは、チャネルがまだ閉じられていない場合にのみ呼び出され、2回以上呼び出されることはありません。

このメソッドの実装では、このチャネルでの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 に答える