这是我的代码,它使用
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
中?
没有理由不使用
write()
上存在的 RandomAccessFile
方法。但是,如果您碰巧正在与需要 WritableByteChannel
的代码进行交互,您可能需要使用 FileChannel
而不是 RandomAccessFile.
在您的示例中,这没有什么区别,但如果您使用 ByteBuffer.allocateDirect 您可以写得更快。 ByteBuffer API 说
字节缓冲区可以是直接缓冲区,也可以是非直接缓冲区。给定一个直接字节缓冲区,Java 虚拟机将尽最大努力直接在其上执行本机 I/O 操作。也就是说,它将尝试避免在每次调用底层操作系统的本机 I/O 操作之一之前(或之后)将缓冲区的内容复制到(或从中复制)中间缓冲区
鉴于没有需要字节缓冲区的
RandomAccessFile.write
重载,我想说使用文件通道的原因非常明显。但假设您确实以更一般的方式表达您的问题。能够通过其文件通道操作 RAF 开启了各种附加功能:
如果您使用 RAF 的文件通道,您将看到这一附加功能,而不是在当前 FP 写入数据的简单功能。