首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java ()和mappedByteBuffer ()

Java ()和mappedByteBuffer ()
EN

Stack Overflow用户
提问于 2013-02-08 14:32:00
回答 2查看 1.7K关注 0票数 1

我有一些关于java.nio.Buffer的问题。基本上,我的问题是,是否总是需要flip()调用来在读取和写入之间切换,或者是否只需要对缓慢的I/O进行调用,例如,在先写后读的情况下,以确保在读取数据之前完全写入数据。我的特别问题是关于mappedByteBuffer的。看起来,如果文件存在并且大小达到我所知道的大小,我就可以使用position(int newPosition)调用导航到文件的任何部分,并执行读或写操作,即基本上将缓冲区用作内存块,而忘记了标记或限制的概念。这是真的吗?

考虑下面的例子。如果我有一个文件,它包含整数1,然后是从头开始的2,似乎我可以将另一个整数3放在位置0,倒带并从缓冲区中读出3和2。这个限制不应该像正常的非mmap缓冲区那样阻止我访问第二个getInt吗?我什么时候需要调用flip()来在mappedByteBuffer的写和读之间切换?谢谢!

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

发布于 2013-02-08 15:09:29

这就是Buffer.flip所做的

代码语言:javascript
复制
347    public final Buffer flip() {
348        limit = position;
349        position = 0;
350        mark = -1;
351        return this;
352    }

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-08 15:29:10

我的问题开始于

()调用是否总是需要在读取和写入之间切换,或者是否只需要缓慢的I/O,例如,在写入然后读取的情况下,以确保数据在读取之前被完全写入。

  1. 任何形式的Buffer都是从一种状态开始的,在这种状态下你可以读入它,或者放入它,这是相同的
    1. 把它放到一种你可以从它写或者从中获取的状态,这是相同的事情。
    2. 尽管它的名字(非常愚蠢),flip()并不是flip()的反面。它唯一的倒数是compact()clear().

为了清楚起见,我发现最好总是让Buffer处于可读状态,只有在需要时才将其转换为可写状态,然后立即将其恢复为可读状态。

这是用于I/O的。

如果你只做get()put(),我不确定我会不会使用flip(),因为这是一个MappedByteBuffer,我肯定不会调用clear()compact(),这两个都会对文件造成可怕的影响,这也排除了使用flip()的可能性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14766979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档