从ObjectInputStream读取数据时获取filepointer位置

时间:2014-03-18 13:09:02

标签: java objectinputstream randomaccessfile file-pointer

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

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


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

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

例如:

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

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

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

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

背后的想法是: 每当我知道一个ID并想知道有关该节点的信息时,我就会查看哪个节点位于节点文件中的特定位置。 每当我知道节点并希望了解有关其父节点ID的更多信息时,我就会查看ID文件中的特定位置。

但是目前我只是将ID和Node-values本身写入文件中,并将它们用作“索引”。

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


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

1 个答案:

答案 0 :(得分:0)

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

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

FileInputStream,您可以致电getChannel(),并返回FileChannel。在FileChannel上有一个方法position(),它返回当前文件位置。

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