这是我的代码,它使用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
?
答案 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上写入数据的简单能力。