为什么我们应该在filechannel中使用“write”方法,因为它们已经存在于RandomAccessFile中

时间:2013-05-29 16:20:57

标签: java nio core

这是我的代码,它使用FileChannel写入文件:

package logging;

import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class Test {

    public static void main(String args[]){
        try {  

            RandomAccessFile rf = new RandomAccessFile("C:\\Users\\kalyan\\Desktop", "rw");
            FileChannel fc = rf.getChannel();
            ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
            byteBuffer.putChar('a');

            while(byteBuffer.hasRemaining()) {
                fc.write(byteBuffer); //usig filechannel to write to the file
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,我使用FileChannel的{​​{1}}方法写入文件,即write

为什么我们不应该使用fc.write已存在的rf.write

3 个答案:

答案 0 :(得分:1)

没有理由不使用write()上存在的RandomAccessFile方法。如果您碰巧正在与需要WritableByteChannel的代码进行交互,那么您可能希望使用FileChannel代替RandomAccessFile.

答案 1 :(得分:1)

在您的示例中它没有任何区别,但如果您使用ByteBuffer.allocateDirect,则可以更快地编写。 ByteBuffer API说

字节缓冲区是直接缓冲区或非直接缓冲区。给定直接字节缓冲区,Java虚拟机将尽最大努力直接执行本机I / O操作。也就是说,它将尝试避免在每次调用其中一个底层操作系统的本机I / O操作之前(或之后)将缓冲区的内容复制到(或从中)缓冲区

答案 2 :(得分:1)

鉴于没有RandomAccessFile.write重载需要一个字节缓冲区我会说使用文件通道的原因非常明显。但是让我们假设你真的以更一般的方式表达你的问题。能够通过其文件通道操作RAF会打开各种附加功能:

  • 文件区域锁定
  • 内存映射
  • 字节从其他渠道对象交换
  • 在不修改当前文件指针的情况下写入文件的部分

如果你使用RAF的文件通道,那么你将会看到这个增加的功能,而不是在当前FP上写入数据的简单能力。