我目前正在为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作为时间条件吗?
既然JavaDoc说:
返回可以在不阻塞的情况下读取的字节数。
我不确定这会不会有什么副作用?
发布于 2017-01-05 21:36:56
检查available()的问题是,可能没有可用的数据,但您仍然没有处于流的末尾。例如,您可能正在通过网络连接读取数据,而网络连接由于发送数据而部分中断。您还没有到达EOF;数据的下一个字节还没有到达。
虽然我不喜欢使用异常来检测在正常情况下(比如流的末尾)所期望的东西,但EOFException的Javadoc表明您应该这样检测流的结束:
在输入期间意外到达文件结束或流结束的信号。 此异常主要用于数据流的输入端信号处理。注意,许多其他输入操作在流结束时返回一个特殊值,而不是抛出异常。
但是ObjectInputStream.readObject()不是返回特殊值的操作之一。
所以,抓住你的鼻子,抓住那个例外。
https://stackoverflow.com/questions/41495045
复制相似问题