4

私は最近FileChannelに出会いました。私はRandomAccessFileの大ファンです。しかし、ファイルからの読み取りとそのコンテンツの別のファイルへの書き込みを選択FileChannelするのはなぜだろうと思っています。RandomAccessFile

特定のパフォーマンス上の理由はありますか? FileChannelファイルチャネルを使用できる理由の1つになる可能性があるため、ロックをいかなる目的にも使用したくありません。他のStackOverflow 応答BufferReaderで提案されているように、使用したり、そのようなことはしたくありません。

4

5 に答える 5

0

FileChannel API は次のように述べています。ファイルの領域はメモリに直接マップされる場合があります。大きなファイルの場合、これは通常の読み取りまたは書き込みメソッドを呼び出すよりもはるかに効率的です。

于 2014-11-27T05:16:39.210 に答える
0

ダイレクト バッファでを使用し、自分でデータにアクセスしない限り、どちらかを選択する必要はありませんFileChannel。たとえば、データを にコピーするだけです。SocketChannel.これは、データが JNI/JVM の境界を越える必要がないため高速です。

しかし、なぜ選ばないのか不思議ですBufferedReader。ファイルを行ごとに読み取る場合、これらのいずれよりも桁違いに高速になることは間違いありません。

于 2014-12-05T00:52:48.523 に答える
-1

RandomAccessFile はパフォーマンスが優れており、ほとんどの主要な型を直接読み書きできます。

于 2014-11-27T05:30:37.273 に答える
-1

FileChannelは、複数の同時スレッドで安全に使用できます。

于 2014-11-27T06:11:52.520 に答える
-1

RandomAccessFile ソース:

RandomAccessFile が実際に内部で FileChannel を使用していることを確認してください...

public final FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
                 channel = FileChannelImpl.open(fd, true, rw, this);

                 /*
                  * FileDescriptor could be shared by FileInputStream or
                  * FileOutputStream.
                  * Ensure that FD is GC'ed only when all the streams/channels
                  * are done using it.
                  * Increment fd's use count. Invoking the channel's close()
                  * method will result in decrementing the use count set for
                  * the channel.
                  */
                 fd.incrementAndGetUseCount();
             }
             return channel;
         }
     }

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/RandomAccessFile.java

于 2015-02-06T20:31:43.327 に答える