以下代码为我提供了错误InvalidClassException
我的User
类实现Serializable
,所以我迷路了。我正在尝试存储list
填充User
个对象,然后才能将其读回来。
List<User> userList = new ArrayList<User>();//list used
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName, true));
os.writeObject(userList);
os.close();
} catch (IOException e1) {
e1.printStackTrace();
}
// input
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
userList = (List<User>) ois.readObject();
ois.close();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
答案 0 :(得分:1)
如果您尝试存储并稍后在文件中检索单个对象(示例中为List<>
),则 不 要<每次写入文件时,strong> 追加 到文件中。相反,您希望每次使用新对象 覆盖 文件。
// Write
List<User> userList = new ArrayList<User>();
try (FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(userList);
} catch (IOException e1) {
e1.printStackTrace();
}
// read
try (FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis)) {
userList = (List<User>) ois.readObject();
} catch (FileNotFoundException | IOException | ClassNotFoundException e1) {
e1.printStackTrace();
}
注意new FileOutputStream(fileName)
不 是否有true
参数。使用true
参数表示您要打开&#34;附加&#34;的文件。使用false
或完全关闭追加参数,将打开&#34;覆盖&#34;的文件。
注意:
我还使用了try-with-resources语句我的例子。这消除了显式关闭流的需要;在try { }
块结束时,流会自动关闭。
我还使用了multi-catch子句,因为你没有区别地处理3个例外,所以它更清晰。