Я пытаюсь выполнить случайные операции чтения / записи над сериализуемыми объектами в файле.
Я знаю, что могу установить положение FileInputStream
, а затем обернуть вокруг него соответствующие входные потоки следующим образом:
InputStream file = new FileInputStream(fileName);
((FileInputStream)file).getChannel().position(pos);
InputStream buffer = new BufferedInputStream(file);
ObjectInput input = new ObjectInputStream (buffer);
Но что, если мне придется изменить положение FileInputStream
позже, чтобы выполнить еще одну операцию записи?
Как мне изменить / сбросить BufferedInputStream
, чтобы он мог работать правильно? Должен ли я вообще?
Кроме того, я предполагаю, что любой ответ на этот вопрос также относится к выходному сценарию ?!
2 ответа
Я думаю, что проще всего создать новый BufferedInputStream
в любой момент, когда вы захотите переместить позицию на FileInputStream
.
Я пытаюсь выполнить случайные операции чтения / записи над сериализуемыми объектами в файле.
Стоп прямо там (и обратно). Вы не можете сделать это любым способом. Поток объектов опирается на свою собственную прошлую историю через систему «дескрипторов» как для классов, так и для объектов. В общем, вам это не удастся, однако вы попытаетесь реализовать это в коде, например, исключив буферизованный поток.
РЕДАКТИРОВАТЬ . Сериализация не выполняет повторную сериализацию уже сериализованного объекта. Например, StreamClassDesc
, который предоставляется каждому объекту. Вместо этого он просто сериализует «дескриптор» к нему. Таким образом, даже если вы просто сериализуете два Strings
, вы не сможете десериализовать второй самостоятельно, потому что дескриптор classdesc ссылается на предыдущий объект в потоке. Смотрите спецификацию сериализации объекта. Существует также заголовок потока для рассмотрения.
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].