怎么判断对象流已经读取到末尾

作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。

对于有用过对象流的人来说,都很清楚,对象流操作的是对象,存入一个一个的对象,也只能读一个一个的对象,但是存在一个问题就是写入多少个就只能读多少个,没有读取到结尾的判断方法,如果读取超过了则会抛出异常java.io.EOFException,那咱们想做到通用如何来判断是否是最后一个呢?

方法一

在存入对象的时候使用集合的方式来存储对象,这样在获取时就只需要获取集合,然后遍历集合即可.

@Test
public void testObjectOutputStream() throws Exception {
    ObjectOutputStream ojbOs = new ObjectOutputStream(new FileOutputStream(new File("user.obj")));
    // 用集合存入对象
    List list = new ArrayList();
    list.add(new Student("willie", 18));
    list.add(new Student("xiaoming", 18));
    // 写入对象
    ojbOs.writeObject(list);
    ojbOs.close();
}

@Test
public void testObjectInputStream() throws Exception {
    ObjectInputStream ojbIs = new ObjectInputStream(new FileInputStream(new File("user.obj")));
    // 读取出集合对象
    List list = (List)ojbIs.readObject();
    // 编辑集合
    list.forEach(System.out::println);
    ojbIs.close();
}

这种是将本来的多个对象转化为一个集合对象,再从集合对象中去获取数据

方式二

方式一的方式可以说是比较好的解决方案,如果不想转为集合对象也可以在存入对象前或者后面加一个标志,可以在第一位置加一个int类型的值来记录存入的对象个数,也可以在最后加入一个null来做结束标识.看到这里是不是已经知道怎么解决,如果还不知道!没关系,上代码.

@Test
    public void testObjectOutputStream2() throws Exception {
        ObjectOutputStream ojbOs = new ObjectOutputStream(new FileOutputStream(new File("student.obj")));
        // 写入对象
        ojbOs.writeObject(new Student("willie", 18));
        ojbOs.writeObject(new Student("xiaoming", 18));
        // 写入一个 null 对象作为结束标识
        ojbOs.writeObject(null);
        ojbOs.close();
    }

    @Test
    public void testObjectInputStream2() throws Exception {
        ObjectInputStream ojbIs = new ObjectInputStream(new FileInputStream(new File("student.obj")));
        // 读取出集合对象
        Object obj = null;
        // 遍历对象,直到遇到null
        while((obj = ojbIs.readObject()) != null){
            Student stu =(Student)obj;
            System.out.println(stu);
        }

        ojbIs.close();
    }

方式三

使用异常处理方式,这个很简单,直接处理 EOFException 就行了,当遇到EOFException 时表示已经读到末尾了.

public void testObjectInputStream3() throws Exception {
    ObjectInputStream ojbIs = new ObjectInputStream(new FileInputStream(new File("student.obj")));
    List list = new ArrayList<>();
    try {
        // 读取对象
        while(true){
            Student stu = (Student)ojbIs.readObject();
            list.add(stu);
        }
    } catch (Exception e) {
        // 读取结束后的操作
        System.out.println(list);
    }
    ojbIs.close();
}

怎么判断对象流已经读取到末尾_第1张图片

你可能感兴趣的:(杂集)