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();

ループに入っていません。

一度に1つのオブジェクトを読み書きするのではなく、リスト全体を1つのオブジェクトとしてファイルに書き込んでから、それを読み戻すことができます。

于 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。一般に、これは実行不可能です。ファイルの補足インデックスがない場合は、dataaseで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 に答える