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++;
    }

答案 1

readObject()不会在 EOF 时返回。您可以捕获 并将其解释为 EOF,但这将无法检测到将正常 EOF 与已被截断的文件区分开来。nullEOFException

更好的方法是使用一些元数据。也就是说,与其询问流中有多少个对象,不如将计数存储在某个位置。例如,您可以创建一个元数据类来记录计数和其他元数据,并将实例存储为每个文件中的第一个对象。或者,您可以创建一个特殊的 EOF 标记类,并将实例存储为每个文件中的最后一个对象。ObjectInput


答案 2

我今天也有同样的问题。尽管这个问题已经很老了,但问题仍然存在,并且没有提供干净的解决方案。应避免忽略,因为当某些对象未正确保存时,可能会引发忽略。写入 null 显然会阻止您将 null 值用于任何其他目的。最后,在对象流上使用始终返回零,因为对象的数量是未知的。EOFExceptionavailable()

我的解决方案非常简单。 只是其他一些流的包装器,例如FileInputStream。尽管返回零,但 FileInputStream.available 将返回一些值。ObjectInputStreamObjectInputStream.available ()

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

   /** calculate number of items **/
   int line_count = 0;
   while( istream.available() > 0) // check if the file stream is at the end
   {
      (String)ois.readObject();    // read from the object stream,
                                   //    which wraps the file stream
      line_count++;
   }