为什么我们应该在文件通道中使用“write”方法,而它们已经存在于 RandomAccessFile [已关闭]

问题描述 投票:0回答:3

这是我的代码,它使用

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
write
方法写入文件,即
fc.write

为什么我们不应该使用

rf.write
,它已经存在于
RandomAccessFile
中?

java nio
3个回答
1
投票

没有理由不使用

write()
上存在的
RandomAccessFile
方法。但是,如果您碰巧正在与需要
WritableByteChannel
的代码进行交互,您可能需要使用
FileChannel
而不是
RandomAccessFile.


1
投票

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

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


1
投票

鉴于没有需要字节缓冲区的

RandomAccessFile.write
重载,我想说使用文件通道的原因非常明显。但假设您确实以更一般的方式表达您的问题。能够通过其文件通道操作 RAF 开启了各种附加功能:

  • 文件区域锁定
  • 内存映射
  • 与其他通道对象的字节交换
  • 写入文件的部分内容而不修改当前文件指针

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

© www.soinside.com 2019 - 2024. All rights reserved.