我正在准备我的OCP考试并发现这个剪辑反序列化了一个对象列表:
public static List<Animal> getAnimals(File dataFile) throws IOException,
ClassNotFoundException {
List<Animal> animals = new ArrayList<Animal>();
try (ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(new FileInputStream(dataFile)))) {
while (true) {
Object object = in.readObject();
if (object instanceof Animal)
animals.add((Animal) object);
}
} catch (EOFException e) {
// File end reached
}
return animals;
}
但是我认为while(true)
和吞下的异常是丑陋的代码。
我可以使用in.available > 0
作为while条件吗?
由于JavaDoc说:
返回可以不阻塞地读取的字节数。
我不确定这是否会产生任何副作用?
答案 0 :(得分:4)
检查available()
的问题是可能没有可用的数据,但您仍然不在流的末尾。例如,您可能正在通过网络连接读取数据,这种情况恰好通过发送数据而中途停止。你不是在EOF;下一个数据字节尚未到达。
虽然我不喜欢使用异常来检测您在正常情况下所期望的事情(比如到达流的末尾),但EOFException
的Javadoc表示这就是您要检测结束的方式。流:
表示在输入过程中意外地达到了文件结尾或流结束。
此异常主要由数据输入流用于信号流的结束。请注意,许多其他输入操作在流末尾返回特殊值,而不是抛出异常。
但ObjectInputStream.readObject()
不是返回特殊值的操作之一。
所以,抓住你的鼻子,抓住那个例外。