作者:黄少存,叩丁狼高级讲师。原创文章,转载请注明出处。
对于有用过对象流的人来说,都很清楚,对象流操作的是对象,存入一个一个的对象,也只能读一个一个的对象,但是存在一个问题就是写入多少个就只能读多少个,没有读取到结尾的判断方法,如果读取超过了则会抛出异常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();
}