我有一个文件,我需要使用相同类型的多个对象进行反序列化。
public static ArrayList<Dog> readDogs() {
ArrayList<Dogs> dogs = null;
ObjectInputStream in = null;
try {
in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(filename)));
dogs = new ArrayList<Dog>();
while(true) {
dogs.add((Dog) in.readObject());
}
} catch (EOFException e) {
} catch (Exception e) {
System.err.println(e.toString());
} finally {
try {
in.close();
} catch (IOException e) {
System.err.println(e.toString());
}
}
return dogs;
}
使用当前的实现,我依靠try子句来捕获并忽略文件结尾异常,这看起来很丑陋,但我不确定如何处理它?</ p>
答案 0 :(得分:1)
不要序列化/反序列化每只狗。序列化/反序列化狗的单个列表。
所有列表实现本身都是Serializable
,序列化它们会自动序列化其所有元素。
答案 1 :(得分:0)
EOFEception
表示由代码之外的内容引起的异常情况。如果您没有捕获代表您可以在代码中修复的某个错误的Error
或RuntimeException
,那么使用Exception
是的最佳方式处理问题。
如果问题不在您的代码中,这是正确的,但在它之外(网络已关闭,文件未找到,文件已损坏),则可以通常建议使用异常处理问题。
在某些情况下,您应该在使用之前验证数据。如果以不正确的格式(例如:用户输入)接收数据的可能性很大,则首先验证它可能更有效。但是在极少数情况下,您可能会有数千个损坏的文件,最好在异常发生时捕获它并处理它。
您可以改进记录异常的代码,以便稍后跟踪它们。您还应该考虑哪个类应该负责处理异常(如果它应该捕获并修复问题,或者它应该声明throws
并将其传播给调用者。
答案 2 :(得分:0)
在阅读下一只狗之前,使用InputStream.available()
来测试数据是否在流中可用。
答案 3 :(得分:0)
以下代码应该有效:
try {
FileInputStream fin = new FileInputStream(filename);
in = new ObjectInputStream(new BufferedInputStream(fin));
dogs = new ArrayList<Dog>();
while (fin.available() > 0) {
dogs.add((Dog) in.readObject());
}
} catch (EOFException e) {
请注意,您应该在available()
对象上调用FileInputStream
,而不是ObjectInputStream
对象,它不能正确支持它。另请注意,您仍然应该捕获并处理EOFException
,因为在特殊情况下它可能仍会被引发。