Чтение из двоичного файла объекта - PullRequest
0 голосов
/ 04 декабря 2011

Мне нужно прочитать серию объектов из двоичного файла.

Я использую:

ObjectOutputStream obj = new ObjectOutputStream(new FileInputStream(fame));

obj.readObject(p);

где p - ссылка на объект, который я создал. Как я могу прочитать весь файл до конца?

Я могу использовать:

while(p!=null){}

Ответы [ 5 ]

2 голосов
/ 04 декабря 2011

readObject() возвращает null тогда и только тогда, когда вы написали null.Правильный метод - перехватить EOFException, а когда вы его получите, закройте поток и выйдите из цикла чтения.

1 голос
/ 04 декабря 2011

Предположим, вы имели в виду ObjectInputStream и p = obj.readObject().

Я хотел бы сделать что-то вроде этого: (это неправильно, см. ПРАВКА ниже)

FileInputStream fstream = new FileInputStream(fileName);
try {
  ObjectInputStream ostream = new ObjectInputStream(fstream);
  while (ostream.available() > 0) {
    Object obj = ostream.readObject();
    // do something with obj
  }
} finally {
  fstream.close();
}

РЕДАКТИРОВАТЬ

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

FileInputStream fstream = new FileInputStream(fileName);
try {
  ObjectInputStream ostream = new ObjectInputStream(fstream);
  while (true) {
    Object obj;
    try {
      obj = ostream.readObject();
    } catch (EOFException e) {
      break;
    }
    // do something with obj
  }
} finally {
  fstream.close();
}

Хотя документация для readObject() прямо не говорит о том, что EOFException выбрасывается в конце потока, это, кажется, подразумевается и может бытьединственный способ обнаружить конец потока.

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

1 голос
/ 04 декабря 2011

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

А если вы будете хранить кучу объектов, используйте соответствующую коллекцию для записи в файл и чтения из нее. В документации API для readObject не указано, что он вернет значение null или выдаст исключение, если достигнут EOF. Чтобы быть в безопасности, используйте Коллекции.

Вы также можете прочитать документы API на ObjectInputStream и ObjectOutputStream .

0 голосов
/ 28 февраля 2017
Boolean i = true;
while(i) {
    try {
        System.out.println(reader.readObject());
    } catch(Exception e) {
        i = false;
        System.out.println("Dead end");
    }
}
0 голосов
/ 04 декабря 2011

Guava's Files.toByteArray делает то, что вы хотите, поэтому, если fame в вашем коде равно File, то

import com.google.common.io.Files;

...

byte[] fameBytes = Files.toByteArray(fame);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...