当我从二进制文件中读取时,我需要获取当前的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
读取时从下一个对象的开头获取文件指针的位置(以字节为单位)?
答案 0 :(得分:0)
我没试过这个,但通常你会像这样创建你的ObjectInputStream
FileInputStream fis = new FileInputStream("filename.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
从FileInputStream
,您可以致电getChannel()
,并返回FileChannel
。在FileChannel
上有一个方法position()
,它返回当前文件位置。
我认为只要你没有缓冲输入流,position()
就应该返回正确的值。