代码之家  ›  专栏  ›  技术社区  ›  Nikola

如何在Java中存储和读取对象的数组列表?

  •  4
  • Nikola  · 技术社区  · 15 年前

    我在从文件中写入和读取对象数组时遇到困难。

    我的对象是这样的:

    package registar;
    
    import java.io.Serializable;
    
    public class Vozilo implements Serializable {
    
        private static final long serialVersionUID = -5302010108271068350L;
    
        private String registracija;
        private String marka;
        private String kategorija;
        private int kubikaza;
    
        public Vozilo(String registracija, String marka, String kategorija,
                int kubikaza) {
            super();
            this.registracija = registracija;
            this.marka = marka;
            this.kategorija = kategorija;
            this.kubikaza = kubikaza;
        }
    /* ALL GETTERS AND SETTERS ARE BELOW */
    

    我正在使用基本的GUI元素来获取输入并将其作为对象存储到文件中…

    我使用以下代码写入名为“test.dat”的文件,并带有可靠标志:

    final ObjectOutputStream fos = new ObjectOutputStream(new FileOutputStream("test.dat", true));
    
    Vozilo novo = new Vozilo(txtRegistracija.getText(), txtMarka.getText(), cbKat.getSelectedItem().toString(), Integer.parseInt(txtKubikaza.getText()) );
    
    try {
        fos.writeObject(novo);
        fos.close();
        JOptionPane.showMessageDialog(unos, "Car was added!");
    } catch (IOException e) {
        e.printStackTrace();
        JOptionPane.showMessageDialog(unos, "Car was NOT added!");
    }
    

    以及要从文件中读取的以下代码:

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.dat"));
    
    ArrayList<Vozilo> list = new ArrayList<Vozilo>();
    Vozilo vozilo = (Vozilo) ois.readObject();
    
    list.add(vozilo);
    ois.close();
    
    for (Vozilo voz : list) {
        System.out.println("Marka: " + voz.getMarka() + "\n");
    }
    

    问题是,我无法从文件中读取所有对象,只显示第一个对象,它将返回indexoutofbounds异常:\ 我做错什么了?

    另外,如果解决办法很明显,不用麻烦,我已经24小时没睡了:p

    提前谢谢!!!! 尼古拉

    5 回复  |  直到 9 年前
        1
  •  2
  •   npinti    15 年前

    您只读取文件中放入的第一个对象,因为:

    Vozilo vozilo = (Vozilo) ois.readObject();
    

    不在循环中。

    您可以做的是将整个列表作为一个对象写入文件,然后再将其读回来,而不是一次写入和读取一个对象。

        2
  •  3
  •   Andy Lin    15 年前

    可以按如下方式添加循环:

    Object obj = null;
    while ((obj = ois.readObject()) != null) {
        if (obj instanceof Vozilo) {
        Vozilo vozilo = (Vozilo) obj;
        list.add(vozilo);
        }
    }
    

    但是,当EOFException到达文件末尾时,需要处理它。

    ps:请在finally块()中使用close()。

        3
  •  1
  •   Javid Jamae    15 年前

    显示的代码没有围绕readObject调用的循环,因此它只读取第一个对象。如果这不是问题所在,那么请发布不起作用的实际代码。

        4
  •  0
  •   user207421    15 年前

    你在尝试不可能的事。不能将对象附加到带有ObjectOutputStream的文件中,然后再次将其返回,因为ObjectOutputStream具有在读回文件时无法理解的头,除非您可以组织了解附录之间的边界,并根据需要每次创建一个新的ObjectOutputStream。一般来说,这是不可行的,因为您有一个文件的补充索引,在这种情况下,您也可以在数据库中使用blobs。如果可能的话,你可以用所有的原始对象加上新的对象来读取和写出一个新的文件,或者最好在你还有对象要写的时候保持文件打开。

        5
  •  0
  •   Viraj Nalawade    9 年前

    你只是在读第一个物体。所以你需要一个循环,在这个循环中你可以不断地从读者那里阅读(使用 readObject 方法)直到最后。

    Object obj = null;
    while ((obj = inputReader.readObject()) != null) {
        if (obj instanceof Indexing) {
        Indexing newObject = (Indexing) obj;
        list.add(newObject);
        }
    }