首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用哪种EOF检查方法?

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

Stack Overflow用户
提问于 2017-01-05 21:31:23
回答 1查看 51关注 0票数 0

我目前正在为OCP考试做准备,并发现这个片段反序列化了一个对象列表:

代码语言:javascript
复制
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说:

返回可以在不阻塞的情况下读取的字节数。

我不确定这会不会有什么副作用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-05 21:36:56

检查available()的问题是,可能没有可用的数据,但您仍然没有处于流的末尾。例如,您可能正在通过网络连接读取数据,而网络连接由于发送数据而部分中断。您还没有到达EOF;数据的下一个字节还没有到达。

虽然我不喜欢使用异常来检测在正常情况下(比如流的末尾)所期望的东西,但EOFException的Javadoc表明您应该这样检测流的结束:

在输入期间意外到达文件结束或流结束的信号。 此异常主要用于数据流的输入端信号处理。注意,许多其他输入操作在流结束时返回一个特殊值,而不是抛出异常。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41495045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档