[英]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.