Я пытаюсь считать количество строки в двоичном файле с помощью 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++;
}
readObject()
не возвращает null
при EOF. Можно поймать EOFException
и интерпретировать его как EOF, но это не позволит отличить обычный EOF от файла, который был усечен.
Лучшим подходом было бы использование некоторых мета-данных. То есть, вместо того, чтобы спрашивать ObjectInput
, сколько объектов находится в потоке, вы должны где-то хранить их количество. Например, вы можете создать класс метаданных, который записывает счетчик и другие метаданные, и хранить его экземпляр как первый объект в каждом файле. Или вы можете создать специальный класс маркера EOF и хранить его экземпляр как последний объект в каждом файле.
Нет, вам нужно знать, сколько объектов находится в двоичном файле. Вы можете записать количество объектов в начале файла (например, используя writeInt) и прочитать его при загрузке.
Другой вариант - вызвать ois.available () и зацикливаться до тех пор, пока он не вернет 0. Однако я не уверен, что это на 100% уверенно.
Нет. Перехватите EOFException
и используйте его для завершения цикла.
Похоже, проблема в записанных вами данных. Если предположить, что данные записаны так, как ожидалось этим кодом, проблем быть не должно.
(Я вижу, вы читаете String
s. Этот ObectInputStream
не предназначен для чтения текстовых файлов. Используйте InputStreamReader
и BufferedReader.readLine
. Аналогично, если вы записали файл с помощью DataOutputSteam.writeUTF
, прочтите его с помощью DataInputStream.readUTF
)