为什么我无法从文件中正确获取对象?

时间:2018-11-08 14:18:38

标签: java serialization

我有自己写的自定义对象列表,然后读取到文件中。

这是我的课程:

public class Book implements Serializable{
   private int isbn;
   private String category;
   private String authorName;

    public int getIsbn() {
        return isbn;
    }

    public String getCatId() {
        return category;
    }


    public void setIsbn(int isbn) {
        this.isbn = isbn;
    }

    public void setCategory(String category) {
        this.category = category;
    }


    public void setAuthorName(String authorName) {
        this.authorName = authorName;
    }

    public String getAuthorName() {
        return authorName;
    }

    public Book() {}

    //copy book 
    public Book(Book book, int id) {
        this.category = book.category;
        this.title = book.title;
        this.authorName = book.authorName;
        this.isbn = id;
    } 
}

这是我用来编写对象列表的函数:

private static <T> void writeToFile(List<T> items, String fileName) {
    try {
        String path = "src\\hw1\\library\\repos\\" + fileName;

        FileOutputStream f = new FileOutputStream(path, true);// true- means append to file
        ObjectOutputStream o = new ObjectOutputStream(f);

        // Write objects to file
        o.writeObject(items);
        o.close();
        f.close();
    } catch (Exception e) {}
}

这是我从列表中读取的功能:

private static <T> List<T> readFromFile(Context context, String fileName) {
    try {
         String path = "src\\hw1\\library\\repos\\" +fileName ;

         FileInputStream fi = new FileInputStream(path);
         ObjectInputStream oi = new ObjectInputStream(fi);
         // Read objects
         List<T> items = (List<T>)oi.readObject();
         oi.close();
         fi.close();

         return items;
    } catch (Exception e) {}
    return null;
}

对象列表被写入文件, 但是当我尝试使用从文件中获得的对象上方的功能读取它时,该对象仅是第一次写入文件的对象。

知道我为什么只从文件中获取第一次写入文件的对象吗?

1 个答案:

答案 0 :(得分:0)

我只是假设

  

但是当我尝试使用我得到的对象上方的功能读取它时   仅从文件中写入的对象。

一次写入将给定列表放入文件,第二次写入将放入另一个列表至该文件-因为您正在追加到文件

现在,您读取方法始终从头读取,因此readFromFile的每次调用都将导致从给定文件中读取相同(对象优先)的对象(在您的情况下列出)。您将不得不在同一视频流上做更多的f.readObject()

如果您不打算一次读取所有对象,我建议每个列表使用1个文件,这样就不会使用试图“移动”文件指针位置的文件(也不做空f.readObject()调用)