我有下面的类,它执行一些计算来填充它的静态数组。
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函数时,数组似乎没有正确初始化。当试图从数组(加载后似乎为空)读取值时,我得到空指针异常
问题在于你的LoadFile方法。Java按值传递参数。在对象的情况下,传递"指针"的副本。当你更新数组时:
arr = (Amount[][])in.readObject();
您没有更新金额。Values1数组,而不是局部的arr变量指向一个新的数组。
您应该将方法签名更改为:
public static Amount[][] loadFile(String filename)
这可能是您在Amount
类中实现的readObject
和writeObject
方法的问题。一个全面的例子可以在这里找到。
你也可以考虑使用XStream来保存/加载数据。它非常容易使用,如下所示。