3

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

这就是我的对象的样子:

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

PS 如果解决方案很明显,请不要打扰,我已经超过 24 小时没有睡觉 :P

先感谢您!!!尼古拉

4

5 回答 5

2

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

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

不在循环中。

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

于 2010-08-08T07:39:09.440 回答
2

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

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

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

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

于 2010-08-08T07:56:17.927 回答
1

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

于 2010-08-08T07:37:28.860 回答
0

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

于 2010-08-09T04:13:06.107 回答
0

您只是在阅读第一个对象。因此,您需要一个循环,您可以在其中继续阅读阅读器(使用readObject方法)直到它到达结尾。

Object obj = null;
while ((obj = inputReader.readObject()) != null) {
    if (obj instanceof Indexing) {
    Indexing newObject = (Indexing) obj;
    list.add(newObject);
    }
}
于 2015-12-08T04:25:42.283 回答