-1

这是我的代码,用于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'swrite方法写入文件,即fc.write.

为什么我们不应该使用rf.write已经存在于 中的RandomAccessFile

4

3 回答 3

1

在您的示例中没有区别,但是如果您使用 ByteBuffer.allocateDirect,您可以写得更快。ByteBuffer API 说

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

于 2013-05-29T16:32:01.520 回答
1

没有理由不write()使用RandomAccessFile. 但是,如果您碰巧正在与需要 a 的代码进行交互WritableByteChannel,则您可能希望使用 theFileChannel而不是RandomAccessFile.

于 2013-05-29T16:28:12.540 回答
1

鉴于没有RandomAccessFile.write占用字节缓冲区的重载,我想说使用文件通道的原因非常明显。但是让我们假设您确实以更笼统的方式表达了您的问题。能够通过其文件通道操作 RAF 开辟了多种附加功能:

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

如果您使用 RAF 的文件通道,您将看到的正是这个附加功能,而不是在当前 FP 写入数据的简单功能。

于 2013-05-29T16:39:33.627 回答