gpt4 book ai didi

JavamappedByteBuffer和flip()和position()

转载 作者:行者123 更新时间:2023-11-30 04:30:25 25 4
gpt4 key购买 nike

我对 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();

最佳答案

这就是 Buffer.flip 的作用

347    public final Buffer flip() {
348 limit = position;
349 position = 0;
350 mark = -1;
351 return this;
352 }

它正在准备缓冲区,以便缓冲区上的下一个读取操作从位置 0 开始并在当前限制处结束。意味着你告诉它,你已经完成了更改缓冲区并准备将其移动或复制到其他地方(这意味着读取它)

关于JavamappedByteBuffer和flip()和position(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14766979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com