читать бинарный файл до конца - PullRequest
2 голосов
/ 04 декабря 2011

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

    try {
        ObjectInputStream reader = new ObjectInputStream(new FileInputStream(fname));

        Object obj = reader.readObject(); 

        if (obj instanceof Azienda) {
            Azienda a = (Azienda) obj;
            company.put(a.getCod(), a);
        } else if (obj instanceof Privato) {
            Privato p = (Privato) obj;
            privato.put(p.getCod(), p);
        }
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    } catch (FileNotFoundException ffe) {
        System.err.println("Error: the file was not found!");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }

таким образом я читаю только один раз за чтение.

когда я читаю текстовый файл, я использую null

Ответы [ 4 ]

4 голосов
/ 04 декабря 2011
try{
    while(true) {
       Object obj=reader.readObject()
     // do sth with object
    }
}catch(EOFException e){
//we expect it so ignore
}

нет проверки EOF, кроме исключения, когда вы читаете мимо него для ObjectInputStream, поэтому вам придется использовать запах кода, называемый исключениями, для потока управления

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

ObjectInputStream не имеет конкретного метода для проверки конца файла.

Но каждый read...() метод ObjectInputStream выдает EOFException, когда пытается прочитать после концафайла.К сожалению, это явно не задокументировано для readObject(), но для всех других методов (readInt() и т. Д.)

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

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

Кажется, что EOFException генерируется, когда больше нет объекта для чтения из потока.К сожалению, это даже не задокументировано.Итак, я вижу следующие решения:

  • вы читаете в цикле, пока не получите это исключение,
  • вы делаете это так, чтобы вы знали заранее количество объектов в потоке,
  • вы делаете так, чтобы был маркерный объект, который отмечает последний объект потока,
  • вы сериализуете (и десериализуете) уникальный объект: List<Object>, содержащий все объекты,Это последнее решение, конечно, предотвращает запись объектов на лету в поток и вынуждает вас хранить все объекты в памяти перед их сериализацией.
1 голос
/ 04 декабря 2011
    ObjectInputStream reader = null;

    try {
        reader = new ObjectInputStream(new FileInputStream("sth"));

        Object obj = null;
        while ((obj = reader.readObject()) != null) {
            System.out.println(obj);
        }


    } catch (EOFException e) {
        System.out.println("finnished reading");
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } catch (FileNotFoundException ex) {
        System.err.println("Error: the file was not found!");
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        reader.close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...