java - 我们如何知道一条记录是否已被读取?我们如何跟踪记录指针?

标签 java file file-io io nio

我对与处理文件相关的算法感到困惑。
根据我的在线研究,表示可变长度记录的标准方法是将元数据沿着数据放置,例如记录的长度。此外,如果我们想按某种顺序保留记录,我们还可以将指向下一条记录的指针存储为记录字段的一部分。
我们以一个文件为例,其中有 <length,data,next_record_ptr> 形式的记录。这与我上面描述的一致。
我看到的代码片段通常会读取内存缓冲区中文件的部分内容,我想这是有道理的。示例:

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)该记录在缓冲区中的索引是多少?

最佳答案

在文件中,记录指针通常存储为记录索引或文件位置。因此,您可以根据您在文件中的当前位置推断您是否已经读取了特定记录。

在您的示例中,您可以使用变量 pos 跟踪文件位置:

int pos = 0;
int nread;  
do {  
   nread = fc.read(copy);
   if(nread == -1) {
      break;
   } else {
      pos += nread;
   }
} while (copy.hasRemaining());  

关于java - 我们如何知道一条记录是否已被读取?我们如何跟踪记录指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034168/

相关文章:

java - 如何获取文件的 base64?

java - Play Framework CompilationException

java - 解析两个文件并生成员工数据

java - 如何在 Java 中隔离不受信任的 native 代码?

file - 将base64字符串转换为文件

file - 如何使用 CMake 将多个文件列表合并在一起?

file-io - 在Clojure中的绝对位置打开文件

javascript - 如何在命令行上使用 SpiderMonkey 读取(本地)文件的内容?

java - Android studio-为按钮添加样式

java - 需要帮助在 Java 中将数字转换为单词