我有一些关于java.nio.Buffer的问题。基本上,我的问题是,是否总是需要flip()调用来在读取和写入之间切换,或者是否只需要对缓慢的I/O进行调用,例如,在先写后读的情况下,以确保在读取数据之前完全写入数据。我的特别问题是关于mappedByteBuffer的。看起来,如果文件存在并且大小达到我所知道的大小,我就可以使用position(int newPosition)调用导航到文件的任何部分,并执行读或写操作,即基本上将缓冲区用作内存块,而忘记了标记或限制的概念。这是真的吗?
考虑下面的例子。如果我有一个文件,它包含整数1,然后是从头开始的2,似乎我可以将另一个整数3放在位置0,倒带并从缓冲区中读出3和2。这个限制不应该像正常的非mmap缓冲区那样阻止我访问第二个getInt吗?我什么时候需要调用flip()来在mappedByteBuffer的写和读之间切换?谢谢!
final int FILESIZE = 1024;
RandomAccessFile fileHandle;
FileChannel fileChannel;
File testFile = new File("c:/temp/testbbrw.dat");
fileHandle = new RandomAccessFile(testFile, "rw");
fileChannel = fileHandle.getChannel();
MappedByteBuffer mbb = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, FILESIZE);
int pos, data;
mbb.position(0);
mbb.putInt(3);
mbb.position(0);
data=mbb.getInt(); //I get 3
data=mbb.getInt(); //I get 2, which was written to the file before this program runs
mbb.force();
fileHandle.close();发布于 2013-02-08 15:09:29
这就是Buffer.flip所做的
347 public final Buffer flip() {
348 limit = position;
349 position = 0;
350 mark = -1;
351 return this;
352 }它正在准备缓冲区,以便缓冲区上的下一次读取操作从位置0开始,并在电流限制处结束。意思是你告诉它,你已经完成了改变缓冲区,并准备移动或复制到其他地方(这意味着读取它)
发布于 2013-02-08 15:29:10
我的问题开始于
()调用是否总是需要在读取和写入之间切换,或者是否只需要缓慢的I/O,例如,在写入然后读取的情况下,以确保数据在读取之前被完全写入。
Buffer都是从一种状态开始的,在这种状态下你可以读入它,或者放入它,这是相同的flip()并不是flip()的反面。它唯一的倒数是compact()和clear().为了清楚起见,我发现最好总是让Buffer处于可读状态,只有在需要时才将其转换为可写状态,然后立即将其恢复为可读状态。
这是用于I/O的。
如果你只做get()和put(),我不确定我会不会使用flip(),因为这是一个MappedByteBuffer,我肯定不会调用clear()或compact(),这两个都会对文件造成可怕的影响,这也排除了使用flip()的可能性。
https://stackoverflow.com/questions/14766979
复制相似问题