Java使用ObjectInputStream读序列化文件仅输出首对象,EOF捕获报错如何解决
核心问题说明
- 现有读取方法每次调用仅打开一次文件流、读取1个对象就关闭流,自然只能拿到第一个序列化对象
- 异常捕获顺序错误:
EOFException是IOException的子类,若你先捕获父类IOException,子类EOFException的捕获块永远不会被触发,IDE就会抛出「不可达catch块」的提示
实现方案(基于EOF终止循环)
你可以直接在读取循环内部捕获EOFException作为读取终止的标识,方法返回存储所有对象的集合即可,参考实现如下:
1. 修改序列化读取方法
import java.util.ArrayList; import java.util.List; import java.io.EOFException; import java.io.FileInputStream; import java.io.IOException; import java.io.ObjectInputStream; public static List<AccountSerializable> serializReadObject() throws ClassNotFoundException, IOException { List<AccountSerializable> accountList = new ArrayList<>(); // try-with-resources语法会自动关闭流,无需手动调用close() try (ObjectInputStream input = new ObjectInputStream(new FileInputStream("accounts.ser"))) { while (true) { try { AccountSerializable obj = (AccountSerializable) input.readObject(); accountList.add(obj); } catch (EOFException e) { // 读到文件末尾,跳出读取循环 break; } } } return accountList; }
2. 修改main方法遍历打印所有对象
public static void main(String[] args) { try { List<AccountSerializable> accounts = serializReadObject(); for (AccountSerializable account : accounts) { System.out.println(account); } } catch (ClassNotFoundException | IOException e) { System.out.println("读取序列化文件出错"); e.printStackTrace(); } }
说明
ObjectInputStream的readObject()方法在读取到文件末尾没有更多对象时,会主动抛出EOFException,我们在循环内部单独捕获该异常终止读取即可,外层不需要额外捕获EOFException,也就不会出现之前的不可达catch块报错。
内容的提问来源于stack exchange,提问作者Skye Smith
相关产品推荐
相关产品推荐

