Я пытаюсь выполнить случайные операции чтения / записи над сериализуемыми объектами в файле.

Я знаю, что могу установить положение FileInputStream, а затем обернуть вокруг него соответствующие входные потоки следующим образом:

InputStream file = new FileInputStream(fileName);
((FileInputStream)file).getChannel().position(pos);
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);

Но что, если мне придется изменить положение FileInputStream позже, чтобы выполнить еще одну операцию записи?

Как мне изменить / сбросить BufferedInputStream, чтобы он мог работать правильно? Должен ли я вообще?

Кроме того, я предполагаю, что любой ответ на этот вопрос также относится к выходному сценарию ?!

0
Bruno Nascimento 25 Апр 2017 в 05:16

2 ответа

Я думаю, что проще всего создать новый BufferedInputStream в любой момент, когда вы захотите переместить позицию на FileInputStream.

1
freedev 25 Апр 2017 в 02:32

Я пытаюсь выполнить случайные операции чтения / записи над сериализуемыми объектами в файле.

Стоп прямо там (и обратно). Вы не можете сделать это любым способом. Поток объектов опирается на свою собственную прошлую историю через систему «дескрипторов» как для классов, так и для объектов. В общем, вам это не удастся, однако вы попытаетесь реализовать это в коде, например, исключив буферизованный поток.

РЕДАКТИРОВАТЬ . Сериализация не выполняет повторную сериализацию уже сериализованного объекта. Например, StreamClassDesc, который предоставляется каждому объекту. Вместо этого он просто сериализует «дескриптор» к нему. Таким образом, даже если вы просто сериализуете два Strings, вы не сможете десериализовать второй самостоятельно, потому что дескриптор classdesc ссылается на предыдущий объект в потоке. Смотрите спецификацию сериализации объекта. Существует также заголовок потока для рассмотрения.

1
Marquis of Lorne 25 Апр 2017 в 03:16