2010-08-08 70 views
4

我有困难瓦特/写入和从文件读取对象数组。如何在java中存储和读取对象的数组列表?

这是我的目标看起来像:

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 /可靠的标志文件:

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

谢谢提前! Nikola

回答

2

你只是读你把文件中,因为这第一个对象:

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

不是在一个循环。

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

+0

我会尝试尽快:) – Nikola 2010-08-08 07:47:11

+0

好主意!有效!我只是喜欢你的建议:D我有几个小错误,现在都修好了。解决方案接受:)谢谢你,npinti! – Nikola 2010-08-08 09:00:08

+0

欢迎:) – npinti 2010-08-08 09:15:20

1

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

3

如下您可以添加一个循环:

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

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

PS:请使用关闭()在最后块:) :)

+0

'readObject()'在流结束时不会返回null:它可以在您写入null时进行循环,直到循环结束为止。您需要循环,直到捕获到“EOFException”。 – EJP 2016-03-26 23:04:53

0

你正在尝试不可能的事情。您不能使用ObjectOutputStream将对象附加到文件并将其重新取回,因为ObjectOutputStreams具有在读取文件时不会被理解的标头,除非您可以组织来知道附加边界之间的位置并创建一个新的ObjectInputStream每次适当。一般来说,这是不可行的,因为你有一个补充索引的文件,在这种情况下,你可能会使用数据库中的斑点。你可以读入文件,并且每次写出一个新的文件加上新的文件,或者如果可能的话,还可以在文件仍然有写的时候保持文件打开。

+0

谢谢你的提示:) – Nikola 2010-08-09 19:15:22

0

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

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

在回答问题时,最好更详细地解释一下,以便网站的其他用户可以更容易地理解它。 – Tristan 2015-12-08 04:44:26

+0

'readObject()'不会在流结束时返回null:它可以在您写入null的任何时候这样做,因此循环直到这样做无效。您需要循环,直到捕获到“EOFException”。 – EJP 2016-03-26 23:05:14

相关问题