Ошибка ObjectInputStream [дубликат]

Проверьте это:

^(([A-Za-z]+[,.]?[ ]?|[a-z]+['-]?)+)$

regex

Вы можете проверить это здесь : https : //regex101.com/r/mS9gD7/46

5
задан 11 June 2009 в 00:45
поделиться

3 ответа

Каждый объект выделяется как часть потока объектов, а не как отдельная личность. «Протокол сериализации потока объектов», как и большинство форматов файлов (но не ZIP!), Имеет заголовок. Это то, что каждый новый ObjectInputStream ожидает найти только в начале файла. Поместить его в середину потока не получится. Также поток имеет обратные ссылки, поэтому ни один объект не записывается дважды (если не указано иное).

Итак, вам нужно будет создать новый ObjectInputStream , чтобы он соответствовал каждому ObjectOutputStream . Существует некоторая внутренняя буферизация, если это вызывает проблему, вам нужно разрезать поток, прежде чем позволить Object (In | Out) putStream на нем.

4
ответ дан 14 December 2019 в 13:45
поделиться

ObjectStream содержит верхний и нижний колонтитулы. Он также содержит информацию о состоянии, т. Е. То, что он записывает, основано на уже записанных объектах.

Таким образом, вы не можете просто добавить к существующему ObjectStream. Что вы можете сделать, так это переписать файл и добавлять объекты каждый раз, когда вы это делаете, или обернуть поток своим собственным протоколом, чтобы вы могли правильно писать / читать несколько потоков.

ObjectStream работает лучше всего, когда вы читаете / записываете данные с одним и тем же база кода (особенно для классов, читаемых / записываемых) ObjectStream не предназначен для переносимости между версиями кода или между различными приложениями.

1
ответ дан 14 December 2019 в 13:45
поделиться

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

Например,

SomeObject[] obj = new SomeObject[numObjects];
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file");
out.writeObject(obj);
out.close();
long ts = System.currentTimeMillis();
ObjectOutputStream tout =
        new ObjectOutputStream(new FileOutputStream("timestamp.obj");
tout.writeObject(new Long(ts));

Потребитель может затем опрашивать файл timestamp.obj каждые несколько минут и, если он изменился, повторно открыть SomeObject [] из потока.

ObjectInputStream in =
        new ObjectInputStream(new FileInputStream("timestamp.obj"));
Long ts = (Long)in.readObject();

if (ts > prevts) {
    ObjectInputStream in2 = new ObjectInputStream(new FileInputStream("file"));
    SomeObject[] obj = (SomeObject[])in.readObject(); 
    prevts = ts;
}
1
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: