Как хранить и читать список объектов массива в Java? - PullRequest
4 голосов
/ 08 августа 2010

У меня проблемы с записью и чтением массива объектов из файла.

Вот так выглядит мой объект:

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 */

Я использую основные элементы графического интерфейса дляполучить входные данные и сохранить их как объект в файле ...

Я использую следующий код для записи в файл с именем "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

Спасибозаранее !!!Nikola

Ответы [ 5 ]

3 голосов
/ 08 августа 2010

Вы можете добавить цикл следующим образом:

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

Однако вам нужно иметь дело с EOFException, когда он достигает конца файла.

PS: пожалуйста, используйте close () в блоке finally :)

2 голосов
/ 08 августа 2010

Вы читаете только первый объект, который вы поместили в файл, начиная с этого:

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

не в цикле.

Что вы могли бы сделать, это, возможно, записать весь список как один объект в файл, а затем прочитать его обратно вместо записи и чтения по одному объекту за раз.

1 голос
/ 08 августа 2010

Код, который вы показываете, не имеет цикла вокруг вызова readObject, поэтому он будет читать только первый объект.Если это не проблема, пожалуйста, опубликуйте фактический код, который не работает.

0 голосов
/ 08 декабря 2015

Вы читаете только первый объект. Таким образом, вам нужен цикл, в котором вы можете продолжать чтение из читателя (используя метод readObject), пока он не достигнет конца.

Object obj = null;
while ((obj = inputReader.readObject()) != null) {
    if (obj instanceof Indexing) {
    Indexing newObject = (Indexing) obj;
    list.add(newObject);
    }
}
0 голосов
/ 09 августа 2010

Вы пытаетесь невозможного.Вы не можете добавлять объекты в файл с помощью ObjectOutputStream и возвращать их снова, потому что у ObjectOutputStreams есть заголовки, которые не будут поняты при обратном чтении файла, если вы не можете организовать, чтобы узнать, где находятся границы между добавлениями, и создатьновый ObjectInputStream каждый раз, когда это необходимо.Как правило, это невозможно, если у вас есть дополнительный индекс для файла, в этом случае вы также можете использовать BLOB-объекты в базе данных.Вы можете прочитать файл и записать новый файл со всеми исходными объектами плюс новый каждый раз, или, если возможно, оставить файл открытым, пока у вас еще есть объекты для записи.

...