我应该使用哪种EOF检查方法?

时间:2017-01-05 21:31:23

标签: java io deserialization

我正在准备我的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说:

  

返回可以不阻塞地读取的字节数。

我不确定这是否会产生任何副作用?

1 个答案:

答案 0 :(得分:4)

检查available()的问题是可能没有可用的数据,但您仍然不在流的末尾。例如,您可能正在通过网络连接读取数据,这种情况恰好通过发送数据而中途停止。你不是在EOF;下一个数据字节尚未到达。

虽然我不喜欢使用异常来检测您在正常情况下所期望的事情(比如到达流的末尾),但EOFException的Javadoc表示这就是您要检测结束的方式。流:

  

表示在输入过程中意外地达到了文件结尾或流结束。

     

此异常主要由数据输入流用于信号流的结束。请注意,许多其他输入操作在流末尾返回特殊值,而不是抛出异常。

ObjectInputStream.readObject()不是返回特殊值的操作之一。

所以,抓住你的鼻子,抓住那个例外。