Java NIO - 截断MappedByteBuffer

时间:2014-03-04 11:29:56

标签: java buffer nio memory-mapped-files random-access

我正在尝试使用MappedMemoryBuffer来存储/删除文件中的部分字节。 Atm,我使用以下方法:我在缓冲区中有一个位置标记文件中的数据结尾(缓冲区比文件稍大,以适应附加)。每个数据块都是固定长度的,比方说200个字节。

我首先要关注的是“标记”文件的结尾。我可以看到两种方法:

  1. 使用某种表示实际数据结束的标记,而文件大小可能更大(由于附加原因我保持稍大一些)。提出某种独特的字节序列可能会很棘手。
  2. 始终确保我们读入的文件是“完整”,即如果该文件是2000字节,则表示其中有10条消息,仅此而已。我认为这甚至比较棘手,因为我们不得不不断地截断文件大小和开放内存缓冲区,这非常麻烦(不能用开放内存映射文件截断文件大小)
  3. 这就是为什么我会更倾向于一个,除非有人知道更好的方法?

    现在,虽然附加非常简单,但删除随机数据块并不是那么简单。我想做的是转移数据以覆盖已删除的消息。我只是将消息右侧的所有字节移动到它的开头。

    一般来说,这是正确的策略,或者是否有人会对此概念提出其他建议或改进?

1 个答案:

答案 0 :(得分:0)

您可以在FileChannel(或File或其他任何内容上使用自定义包装类,只要您知道它是您的文件)并使其提供映射,甚至自己编写映射。 / p>

在此课程中,跟踪大小。让它实现Closeable。当你.close()它时,取消映射所有内容并截断/扩展到适当的大小。