Получить позицию указателя файла при чтении данных из ObjectInputStream

Мне нужно получить текущую позицию указателя файла (в байтах), когда я читаю из моего двоичного файла. Я написал файл используя ObjectOutputStreamи теперь мне нужно прочитать его и запомнить байтовую позицию каждого объекта.

Тем не мение: ObjectInputStream не предоставляет метод для чтения позиции указателя, и RandomAccessFile не могу читать объекты:(


Если вы думаете, что есть способ или даже обходной путь, эта дополнительная информация может помочь:

Я сохранил идентификаторы в моем файле. Каждый идентификатор содержит как минимум один узел (может быть много узлов). Все как долгосрочные.

Например:

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

Каждый идентификатор представляет собой отдельный объект, который хранит само значение id как длинное значение, а узлы - как ArrayList<Long>,

Есть второй файл, в котором хранятся узлы и перечислены родительские идентификаторы каждого узла. Как это:

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

Идея заключается в следующем: всякий раз, когда я знаю идентификатор и хочу знать информацию об узле, я смотрю, какой узел находится в конкретной позиции в файле узла. Всякий раз, когда я знаю узел и хочу узнать больше об его родительском идентификаторе, я смотрю на конкретную позицию в файле идентификатора.

Однако в настоящее время я просто сам записал ID и Node-значения в файлы, используя их как "индекс".

Я не хочу искать строку за строкой, если это идентификатор, который я ищу, так как эти файлы могут стать очень большими (размер в ГБ). Было бы проще, если бы я запомнил байтовую позицию другого файла вместо строчного индекса или около того, потому что тогда я могу просто перейти к нему с помощью skip() или аналогичных методов.


Вывод: Как получить позицию указателя файла (в байтах) от начала следующего объекта при чтении из ObjectInputStream?

1 ответ

Решение

Я не пробовал это, но обычно вы создаете свой ObjectInputStream, как это

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

От FileInputStream, ты можешь позвонить getChannel() который возвращает FileChannel, На FileChannel есть метод position() который возвращает текущую позицию файла.

Я думаю, если вы не буферизуете входной поток между ними, position() должен вернуть правильное значение.

Другие вопросы по тегам