работа ObjectInputStream - PullRequest
       14

работа ObjectInputStream

0 голосов
/ 17 июня 2011

У меня есть несколько объектов, хранящихся в файле. Это касается ObjectInputStream.Если у меня есть следующий код:

FileInputStream fis = new FileInputStream(filename);

ObjectInputStream ois = new ObjectInputStream(fis);

Object obj1 = (Object)ois.readObject();

ois.close();
 ois = new ObjectInputStream(fis);

Object obj2 = (Object)ois.readObject();

Мой вопрос: будет ли readObject, вызываемый из второго объекта Object (obj2), быть первым или вторым объектом в файле

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Это приведет к исключению. Вызов close для ObjectInputStream также закроет FileInputStream.

0 голосов
/ 17 июня 2011

Зависит от того, как вы хранили предметы.Если вы использовали один единственный ObjectOutputStream, то лучше также использовать один единственный ObjectInputStream.

Если вы использовали отдельные потоки для вывода, вы также должны использовать отдельные потоки для ввода.Но это не очень рекомендуется.


Для вашей "постоянной очереди" я бы порекомендовал что-то вроде этого:

На отправляющей стороне:

  • Создайте ByteArrayOutputStream, оберните ObjectOutputStream вокруг него.
  • Запишите объект в OOS и закройте OOS.
  • Получите byte[] и запишите его вместе с заголовком, указывающим длинув ваш поток очереди.

На принимающей стороне:

  • чтение длины заголовка из потока очереди.
  • чтение byte[] иззаданная длина из потока очереди.
  • создайте ByteArrayInputStream из этого массива и оберните ObjectInputStream вокруг него.
  • прочитайте один объект из OIS, закройте OIS.

Когда вы храните части своей очереди, всегда сохраняйте целые сообщения (т. Е. Заголовок вместе с объектом).

Конечно, может быть проще использовать уже существующие решения, такие как JMS(где бы вы создали ObjectMessage и отправьте его в очередь).

...