Java FileInputStream ObjectInputStream достигает конца файла EOF

Я пытаюсь считать количество строки в двоичном файле с помощью readObject, но я получаю IOException EOF. Я делаю это правильный путь?

    FileInputStream istream = new FileInputStream(fileName);
    ObjectInputStream ois = new ObjectInputStream(istream);

    /** calculate number of items **/
    int line_count = 0;
    while( (String)ois.readObject() != null){            
        line_count++;
    }
21
задан tshepang 27 June 2014 в 06:08
поделиться

4 ответа

readObject() не возвращает null при EOF. Можно поймать EOFException и интерпретировать его как EOF, но это не позволит отличить обычный EOF от файла, который был усечен.

Лучшим подходом было бы использование некоторых мета-данных. То есть, вместо того, чтобы спрашивать ObjectInput, сколько объектов находится в потоке, вы должны где-то хранить их количество. Например, вы можете создать класс метаданных, который записывает счетчик и другие метаданные, и хранить его экземпляр как первый объект в каждом файле. Или вы можете создать специальный класс маркера EOF и хранить его экземпляр как последний объект в каждом файле.

27
ответ дан 29 November 2019 в 06:54
поделиться

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

Другой вариант - вызвать ois.available () и зацикливаться до тех пор, пока он не вернет 0. Однако я не уверен, что это на 100% уверенно.

0
ответ дан 29 November 2019 в 06:54
поделиться

Нет. Перехватите EOFException и используйте его для завершения цикла.

6
ответ дан 29 November 2019 в 06:54
поделиться

Похоже, проблема в записанных вами данных. Если предположить, что данные записаны так, как ожидалось этим кодом, проблем быть не должно.

(Я вижу, вы читаете String s. Этот ObectInputStream не предназначен для чтения текстовых файлов. Используйте InputStreamReader и BufferedReader.readLine . Аналогично, если вы записали файл с помощью DataOutputSteam.writeUTF , прочтите его с помощью DataInputStream.readUTF )

0
ответ дан 29 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

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