2014-03-04 39 views
0

我试图用MappedMemoryBuffer从文件中存储/删除部分字节。 Atm中,我使用了以下方法:我在缓冲区中有一个位置标记文件中的数据结尾(缓冲区比文件稍大一些以容纳追加)。每个数据块都是固定长度的,比方说200个字节。Java NIO - 截断MappedByteBuffer

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

  1. 使用某种标记来表示实际数据的结束,而文件大小可能更大(由于我为了追加原因而保持略大一点)。想出一些独特的字节序列可能会很棘手。
  2. 务必确保我们读入的文件是“完整的”,即如果该文件是2000字节,这意味着它中有10条消息,仅此而已。这是更加棘手我想,我们必须不断地截断文件大小和开放的内存缓冲区是相当繁琐(一个不能截断开放的内存映射文件的文件大小)

这就是为什么我会瘦更多的是针对某个人,除非有人知道更好的方法?

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

一般来说,这是正确的策略,还是会有人提出其他的或改进的概念?

+0

移动文件中的数据是一个坏主意。如果块的顺序不重要,可以将最后一块移动到已删除块的位置(因为块的大小相同)。否则,你应该添加一种方法来将块标记为删除并清除,一旦你有明显稀疏的块。 – Holger

+0

由于性能原因或更多,正在改变? – Bober02

+0

主要表现。但它也与您的意图是安全的,当你的应用程序在操作之间中断时。 – Holger

回答

0

你可以在FileChannel(或File或其他什么,只要你知道它是你的文件)上使用自定义包装类,并让它提供映射,甚至可以自己写映射。

在这门课上,跟踪大小。使其实现Closeable。而当你.close()它,取消一切,并截断/扩大到适当的大小。

+0

主要关心的是,jvm可能会崩溃,并且文件将处于不一致的状态,因此有一种方法可以不断标记文件的结尾(使用标记为I上述)似乎更安全 – Bober02

+0

好吧,考虑到你的文件的大小(相当小),你也可以让这个类写入临时文件并在'close()'上重命名为原始文件。 – fge