簡體   English   中英

我應該使用哪種EOF檢查方法?

[英]Which EOF check method should I use?

我目前正在為我的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說:

返回可以無阻塞讀取的字節數。

我不確定這是否有副作用?

檢查available()的問題是可能沒有可用數據,但是您仍然不在流的末尾。 例如,您可能正在通過網絡連接讀取數據,而該網絡連接恰好在發送數據的途中停滯了。 您不在EOF; 下一數據字節尚未到達。


盡管我不喜歡使用異常來檢測正常情況下(例如到達流的末尾)的期望,但是EOFException的Javadoc指示這就是檢測流的末尾的方式:

表示在輸入過程中意外到達文件結尾或流結尾。

此異常主要由數據輸入流用來通知流結束。 注意,許多其他輸入操作在流的末尾返回一個特殊值,而不是引發異常。

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

因此,請保持警惕,並抓住那個例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM