【发布时间】:2013-11-30 19:11:05
【问题描述】:
我对与处理文件相关的算法感到困惑。
根据我的在线研究,表示可变长度记录的标准方法是将元数据放在数据中,例如记录的长度。此外,如果我们想按某种顺序保存记录,我们还可以将指向下一条记录的指针存储为记录字段的一部分。
让我们以一个文件为例,其中我们有<length,data,next_record_ptr> 形式的记录,这与我上面描述的一致。
我看到的代码 sn-ps 通常会在内存缓冲区中读取文件的一部分,我猜这很有意义。示例:
ByteBuffer copy = ByteBuffer.allocate(SIZE);
FileChannel fc = FileChannel.open(file, READ, WRITE);
int nread;
do {
nread = fc.read(copy);
} while (nread != -1 && copy.hasRemaining());
我认为这或多或少是一种读取内存中文件部分的方法。 SIZE 的大小可以包含我们的多个记录。
问题:当我们在内存中有 X 条记录时,我们如何知道我们要读取的特定记录是否在我们的缓冲区中?示例:如果我有指向下一条记录的指针,我如何知道该特定记录已作为缓冲区的一部分加载,或者我必须从文件中读取更多数据?
这部分在教科书中被提到很简单,但我对这实际上是如何实现的感到困惑。
明确一点:用 Java 提供示例代码真的很棒!!!但是用伪代码或清晰的算法对我来说清楚地解释这个黑点也很棒!
更新:
为了更清楚:
如果我已经读取了数组 [N] 中的 N 条记录。如果我阅读记录 array[0] 然后得到 array[0].pointerToNext 这是例如0x123A 在文件中。我怎么知道:
1) 如果位置0x123A中的记录已在缓冲区中读取,即array[n]
2) 这条记录在缓冲区中的索引是多少?
【问题讨论】:
-
您需要在读取文件时以某种方式解释数据。读取长度和/或指针并跟踪读取了多少字节和/或读取器的位置以找到起点。您还可以将某种标识符存储为数据的一部分。
-
@Radiodef:您的意思是以某种方式将缓冲区大小与记录指针相关联?
-
是的,你可以这样做。要么这样做,要么让它足够大,以使整个记录适合存在重叠的缓冲区。或分段阅读记录。但最重要的是以某种方式跟踪这一切。 AFAIK 所有 InputStream 衍生物都有一个带有长度参数的读取,因此如果您已将长度存储在文件中,则不一定需要重叠读取。
-
@Radiodef:我有点迷失你了。如果我在缓冲区中索引 0 处的记录具有下一条记录
0x1234的指针的值,我怎么知道该文件位置中的记录是否在缓冲区中读取? -
从文件中流的位置中减去它,看看它的前面或后面有多远。如果记录没有按顺序出现在文件中,最好的方法是 IMO 以某种方式寻找:stackoverflow.com/questions/3792747/…Java 不幸的是通常没有有效的寻找方法。