【问题标题】:How to store and read an array list of objects in java?如何在java中存储和读取对象的数组列表?
【发布时间】:2011-03-26 21:30:44
【问题描述】:

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

这是我的对象的样子:

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

提前谢谢你!!! 尼古拉

【问题讨论】:

    标签: java arraylist objectoutputstream objectinputstream


    【解决方案1】:

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

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

    不在循环中。

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

    【讨论】:

    • 好主意!有效!我按照你的建议做了:D 我有几个小错误,现在都修复了。解决方案已接受 :) 谢谢你,npinti!
    【解决方案2】:

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

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

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

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

    【讨论】:

    • readObject() 不会在流结束时返回 null:它可以在您写入 null 的任何时候执行此操作,因此循环直到它这样做是无效的。您需要循环直到EOFException 被捕获。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 在回答问题时,最好解释得更详细,以便网站的其他用户更容易理解。
        • readObject() 不会在流结束时返回 null:它可以在您写入 null 的任何时候执行此操作,因此循环直到它执行此操作是无效的。你需要循环直到EOFException被捕获。
        猜你喜欢
        • 2023-03-11
        • 1970-01-01
        • 2020-09-02
        • 2021-08-27
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-24
        相关资源
        最近更新 更多