如何从ObjectInputStream读取所有对象

时间:2018-11-25 11:51:05

标签: java file

我有一个包含一些信息的文件,如何读取所有信息?

Name names;    
try (FileInputStream fileInputStream = new FileInputStream(file)) {
            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
            names = (Name) objectInputStream.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

1 个答案:

答案 0 :(得分:0)

您有几种解决方案,具体取决于输入:

  • 您可以迭代直到流被完全用尽:我认为这是我提供给您的解决方案中最糟糕的解决方案。更糟糕的是,您正在检查是否已达到EOF,同时您应该知道完成的时间(例如:文件格式错误)。

    Set<Name> result = new HashSet<>();
    try { 
      for (;;) { 
        result.add((Name)objectInputStream.readObject());
      }
    } catch (EOFException e) {
      // End of stream
    } 
    return result;
    
  • 产生输入时,序列化一个集合并在其上调用readObject()。只要每个对象都实现SerializationSerializable就应该能够读取集合。

    static void write(Path path, Set<Name> names) throws IOException {
      try (OutputStream os = Files.newOutputStream(path);
           ObjectOutputStream oos = new ObjectOutputStream(os)) {
        oos.writeObject(names);    
      }       
    } 
    
    static Set<Name> read(Path path) throws IOException {
      try (InputStream is = Files.newInputStream(path);
           ObjectInputStream ois = new ObjectInputStream(is)) {
        // WARN Files.newInputStream is not buffered; ObjectInputStream might
        // be buffered (I don't remember).
        return (Set<Name>) ois.readObject();
      }
    }
    
  • 在产生输入时,可以添加一个int来指示要读取的对象的数量,并对其进行迭代:如果您不太在意集合({ {1}})。结果文件将较小(因为您将没有HashSet元数据)。

    HashSet

另外,int result = objectInputStream.readInt(); Name[] names = new Name[result]; // do some check on result! for (int i = 0; i < result; ++i) { names[i] = (Name) objectInputStream.readObject(); } 很好,但是由于它们使用Set / hashCode()删除重复项,因此,如果您定义equals() / equals,则对象可能会更少事后更改(例如:您的hashCode区分大小写,但现在不区分大小写,例如:Name)。