0

从二进制文件中读取时,我需要获取当前的文件指针位置(以字节为单位)。我使用 编写文件ObjectOutputStream,现在我需要读取它并记住每个对象的字节位置。

但是:ObjectInputStream不提供读取指针位置的方法,并且RandomAccessFile无法读取对象:(


如果您认为有办法,甚至是解决方法,这些额外信息可能会有所帮助:

我已将 ID 存储在我的文件中。每个 ID 至少列出一个节点(可以是多个节点)。全部作为长值。

例如:

ID Node Node ...
123151824812  12419512 1248129412 124912 5992039 1924823590
5238952323942 283492384 234892348 234908234 2348902348 5902303 239235523
...

每个 ID 都是一个单独的对象,它将 id 值本身存储为 long 值,节点存储为ArrayList<Long>.

第二个文件存储节点并列出每个节点的父 ID。像这样:

Node ID ID ...
12419512 123151824812
234892348 5238952323942 27834918128911
...

背后的想法是:每当我知道一个 ID 并想知道有关节点的信息时,我都会查看哪个节点位于节点文件中的特定位置。每当我知道节点并想进一步了解其父 ID 时,我都会查看 ID 文件中的具体位置。

然而,目前我只是将 ID 和节点值本身写入文件中,使用它们作为“索引”。

如果那是我要查找的 ID,我不想逐行查看,因为这些文件可能会变得非常大(GB 大小)。如果我记住另一个文件的字节位置而不是行索引左右会更容易,因为我可以使用 skip() 或类似方法简单地跳转到它。


结论:如何在读取时从下一个对象的开头获取文件指针位置(以字节为单位)ObjectInputStream

4

1 回答 1

1

我没有尝试过,但通常你会像这样创建你的 ObjectInputStream

FileInputStream fis = new FileInputStream("filename.txt");
ObjectInputStream ois = new ObjectInputStream(fis);

从 中FileInputStream,您可以调用getChannel()which 返回 a FileChannel。上面FileChannel有一个position()返回当前文件位置的方法。

我认为只要您之间没有缓冲输入流,就position()应该返回正确的值。

于 2014-03-18T13:58:32.180 回答