2010-08-08 15 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

相關問題