我在Java中有一个RandomAccessFile,我管理一些数据。简化: 在文件的开头我有一个索引。 (每个数据集长8个字节的值,表示可以找到实际数据的偏移量。)
因此,如果我现在想要找到数据集no 3的数据,例如。我在偏移量(2 * 8)处读取了8个字节。 (索引从0开始)。
数据集本身由4个字节组成,表示数据集的大小,然后是属于数据集的所有字节。
如果我总是重写整个文件,那么工作正常。
这里非常重要的是,数据集no 3可能已被写为文件中的第一个条目,因此索引是有序的,但不是自己的数据。
如果我插入新数据集,我总是将它附加到文件的末尾。但是可以在一个文件中的数据集的数量是有限的。如果我可以在文件中存储100个数据集,那么索引中总会有100个条目。如果从数据集的索引读取的偏移量为0,则数据集是新的,并将附加到文件中。
是的,有一个案例对我不起作用。如果我读数据集没有。 3从文件,我在我的应用程序中添加一些数据,我想在文件中更新它我不知道如何做到这一点。如果它的长度与我相同,我可以简单地覆盖旧数据。但是,如果新数据集的字节数多于旧数据集,则必须移动该数据集后面的文件中的所有数据,并更新这些数据集的索引。
知道怎么做吗? 或者是否有更好的方法来管理将这些数据集存储在文件中?
PS:是的,我当然想到使用数据库,但这不适用于我的项目。我确实需要简单的文件。
答案 0 :(得分:1)
您无法轻松地将数据插入文件的中间。您基本上必须读取所有剩余数据,写入“新”数据,然后重写“旧”数据。或者,您可能使旧的“慢”无效(可能允许稍后重用),然后将整个新记录写入文件的末尾。说实话,您的文件格式并不是很清楚,但从根本上说,您需要注意不能在文件中间插入(或删除)。
答案 1 :(得分:0)
我在Java中有一个RandomAccessFile,我管理一些数据。
停在那儿。您有一个文件。您目前正在通过Java中的RandomAccessFile访问它。但是,您的整个问题与文件本身有关,而与RandomAccessFile或Java无关。您有一个主要的文件设计问题,因为您正在假设插入到文件中间的工具,这些工具在我自1979年以来使用的任何文件系统中都不存在。
答案 2 :(得分:0)
正如其他人所回答的那样,没有真正的可能性使文件更长/更短而不重写整体。有一些变通办法,也许一个解决方案可能会起作用。
大多数解决方案都有数据开销,但文件大小通常不是问题,如上所述,您可以让某些方法"清理它"。
PS:我希望能回答这些陈旧的问题 - 我在帮助中心找不到任何相关内容,而且我在这里相对较新。