谁在性能文件通道或RandomAccessFile中读写更好?

时间:2014-11-27 05:11:36

标签: java nio randomaccessfile filechannel

我最近遇到FileChannel,我是RandomAccessFile的粉丝。但我想知道为什么我会选择FileChannel而不是RandomAccessFile来读取文件并将该内容写入另一个文件。

是否有任何具体的表现原因?我不想出于任何目的使用FileChannel的锁定,因为我认为这可能是可以使用filechannel的原因之一。我不想按other StackOverflow响应中的建议使用BufferReader或类似内容。

5 个答案:

答案 0 :(得分:0)

FileChannel API说:文件的一个区域可以直接映射到内存中;对于大文件,这通常比调用通常的读取或写入方法更有效。

答案 1 :(得分:0)

除非你使用带有直接缓冲区的FileChannel并且永远不会自己访问数据,否则它们之间没有什么可供选择的,例如:您只需将其复制到SocketChannel.这样更快,因为数据永远不必跨越JNI / JVM边界。

但我想知道你为什么不挑选BufferedReader。对于逐行读取文件,它肯定比其中任何一个快几个数量级。

答案 2 :(得分:-1)

RandomAccessFile性能良好,它允许直接读写大多数主要类型。

答案 3 :(得分:-1)

FileChannel 可以安全地供多个并发线程使用。

答案 4 :(得分:-2)

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