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

时间:2010-08-08 07:25:40

标签: java arraylist objectoutputstream objectinputstream

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

这就是我的对象的样子:

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”的文件w / dependable flag:

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异常:\ 我做错了什么?

P.S。如果解决方案很明显,请不要打扰,我已经睡了超过24小时:P

提前谢谢!!! 尼古拉

5 个答案:

答案 0 :(得分:3)

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

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

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

PS:请在finally块中使用close():)

答案 1 :(得分:2)

您只读取放在文件中的第一个对象:

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

不在循环中。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你正在尝试不可能的事。您不能将对象附加到具有ObjectOutputStream的文件并再次将其取回,因为ObjectOutputStreams具有在您读回文件时无法理解的标题,除非您可以组织以了解附加之间的边界在哪里并创建每次都适当地使用新的ObjectInputStream。一般来说,这是不可行的;如果你有一个文件的补充索引,在这种情况下你可能也使用数据库中的blob。您可以读取该文件并写出一个包含所有原始对象和新文件的新文件,或者更好的是,如果可能的话,仍然保持文件打开,同时还有要写入的对象。

答案 4 :(得分:0)

您只是在阅读第一个对象。所以你需要一个循环,你可以继续阅读阅读器(使用readObject方法),直到它结束。

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