2011-10-22 50 views
1

我有以下類,它執行一些計算來填充它的靜態數組。使用java序列化保存/加載對象數組

public class Amount implements Serializable{ 
     private static final long serialVersionUID = 8141477444408242243L; 
     public static Amount values1[][] = new Amount[10][30]; 
     public static Amount values2[][] = new Amount[10][30]; 
     public static Amount values3[][] = new Amount[10][30]; 

     double highestValue; 
     double highestAmount; 
     double lowestAmount; 
     double lowestValue; 

     ... 
} 

由於計算需要20分鐘左右,我期待存儲在文件中的數組和裝載值在程序啓動時。我試圖用Java序列化方法,並具有以下功能

public static void loadFile(Amount[][] arr, String filename){ 
    try { 
     FileInputStream fis = new FileInputStream(filename); 
     ObjectInputStream in = new ObjectInputStream(fis); 
     arr = (Amount[][])in.readObject(); 
     in.close(); 
     } 
     catch (Exception e) { 
      System.out.println(e); 
     } 
} 

public static void saveFile(Amount[][] arr, String filename){ 
    try { 
     FileOutputStream fos = new FileOutputStream(filename); 
     ObjectOutputStream out = new ObjectOutputStream(fos); 
     out.writeObject(arr); 
     out.flush(); 
     out.close(); 
     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 
} 

我這樣調用saveFile(values1, "valueOneSaveFile");loadFile(values1, "valueOneSaveFile");

我已經運行一次程序,保存所有陣列的各種文件。這些文件已經被創建並且看起來是正確的大小。當我改變我的程序來調用loadFile函數時,數組似乎不能正確初始化。試圖從陣列讀取的值(這似乎是空的後負荷)

+0

你有沒有考慮過使用嵌入式數據庫,而不是去文件? :-) – corsiKa

回答

3

問題出在您的LoadFile方法中。 Java按值傳遞參數。在對象的情況下,傳遞「指針」的副本。 當你更新數組:

arr = (Amount[][])in.readObject(); 

你沒有更新Amount.values1陣列,而不是本地ARR變量指向一個新的數組。

你應該方法簽名更改爲:

public static Amount[][] loadFile(String filename) 

而且相應地使用它。

+0

是的,你很對。謝謝 – Wozza

+0

雖然我有些困惑。因此,在原始代碼中,'loadFile'函數的第一個參數將作爲指針傳入。該函數然後創建該指針的副本,並更新該副本以指向存儲文件加載結果(即'in.readObject()')的不同區域的內存。發送給該函數的指針保持不變,仍然指向一個空數組。這是否正確 – Wozza

+1

Java中沒有真正的指針。我猜想說引用是更正確的。你上面寫的是正確的。原始數組變量永遠不會被初始化,因此當您訪問它時會得到NullPointerException。 – Erel

0

這可能是與你在你的Amount類實現readObjectwriteObject方法一個問題,當我得到空指針異常。一個全面的例子可以發現here

您也可以考慮使用XStream來保存/加載您的數據。它很容易使用,如圖所示here