在RandomAccessFile中插入数据并更新索引

时间:2011-10-10 08:43:39

标签: java java-io

我在Java中有一个RandomAccessFile,我管理一些数据。简化: 在文件的开头我有一个索引。 (每个数据集长8个字节的值,表示可以找到实际数据的偏移量。)

因此,如果我现在想要找到数据集no 3的数据,例如。我在偏移量(2 * 8)处读取了8个字节。 (索引从0开始)。

数据集本身由4个字节组成,表示数据集的大小,然后是属于数据集的所有字节。

如果我总是重写整个文件,那么工作正常。

这里非常重要的是,数据集no 3可能已被写为文件中的第一个条目,因此索引是有序的,但不是自己的数据。

如果我插入新数据集,我总是将它附加到文件的末尾。但是可以在一个文件中的数据集的数量是有限的。如果我可以在文件中存储100个数据集,那么索引中总会有100个条目。如果从数据集的索引读取的偏移量为0,则数据集是新的,并将附加到文件中。

是的,有一个案例对我不起作用。如果我读数据集没有。 3从文件,我在我的应用程序中添加一些数据,我想在文件中更新它我不知道如何做到这一点。

如果它的长度与我相同,我可以简单地覆盖旧数据。但是,如果新数据集的字节数多于旧数据集,则必须移动该数据集后面的文件中的所有数据,并更新这些数据集的索引。

知道怎么做吗? 或者是否有更好的方法来管理将这些数据集存储在文件中?

PS:是的,我当然想到使用数据库,但这不适用于我的项目。我确实需要简单的文件。

3 个答案:

答案 0 :(得分:1)

您无法轻松地将数据插入文件的中间。您基本上必须读取所有剩余数据,写入“新”数据,然后重写“旧”数据。或者,您可能使旧的“慢”无效(可能允许稍后重用),然后将整个新记录写入文件的末尾。说实话,您的文件格式并不是很清楚,但从根本上说,您需要注意不能在文件中间插入(或删除)。

答案 1 :(得分:0)

  

我在Java中有一个RandomAccessFile,我管理一些数据。

停在那儿。您有一个文件。您目前正在通过Java中的RandomAccessFile访问它。但是,您的整个问题与文件本身有关,而与RandomAccessFile或Java无关。您有一个主要的文件设计问题,因为您正在假设插入到文件中间的工具,这些工具在我自1979年以来使用的任何文件系统中都不存在。

答案 2 :(得分:0)

正如其他人所回答的那样,没有真正的可能性使文件更长/更短而不重写整体。有一些变通办法,也许一个解决方案可能会起作用。

  • 将所有数据集限制为固定长度
  • 通过更改/删除索引进行删除,并通过始终添加到文件末尾来添加。如果新数据集较长,则删除旧数据集并将新数据集添加到末尾进行更新。 通过实际删除"忽略的数据集"来不时压缩文件。并将所有有效数据集移动到一起(重写所有内容)。
  • 如果您不能将数据集限制为固定长度,并且您打算更新数据集使其更长,您还可以将指针留在数据集第一部分的末尾,并在以后的数据集中继续使用文件。因此,您可以获得类似链接列表的结构。如果进行了大量的编辑,那么重新排列& 压缩文件。

大多数解决方案都有数据开销,但文件大小通常不是问题,如上所述,您可以让某些方法"清理它"。

PS:我希望能回答这些陈旧的问题 - 我在帮助中心找不到任何相关内容,而且我在这里相对较新。