黑马程序员技术交流社区

标题: ObjectInputStream的readObject怎么判断独到文件末尾? [打印本页]

作者: 浮出一个美    时间: 2014-1-3 09:46
标题: ObjectInputStream的readObject怎么判断独到文件末尾?
本帖最后由 浮出一个美 于 2014-1-6 11:57 编辑

如果文件里有多个对象,而我又要一个对象一个对象的去读取,如果对象被读完了,还要继续读的话就会报EOF异常。
readObject()没有像read()独到末尾返回-1,也没有像readline()独到末尾返回null。他就是返回对象,读完了就异常。
我看别人又两种解决办法:
1.写对象文件的时候把对象的个数存储起来,这样子读的时候就知道有多少个对象了。
可是这样,还要单独持久化一个存储对象个数的数据
2.while(true),一直读,知道抛出异常,然后继续执行后面的动作,像这样
  1. ObjectInputStream ois = null;
  2.                 List<Person> list = new ArrayList<Person>();
  3.                 try {
  4.                         ois = new ObjectInputStream(new FileInputStream("obj.object"));
  5.                         while(true){
  6.                                 Person person = (Person) ois.readObject();
  7.                                 list.add(person);
  8.                         }
  9.                 } catch (Exception e) {
  10.                         e.printStackTrace();
  11.                 }
  12.                 for(Person p :list ){
  13.                         System.out.println(p.toString());
  14.                 }
复制代码

我感觉两种方法都不是很方便,请问大家还有什么更好的方法可以共享?
作者: jibenwujie    时间: 2014-1-3 10:17
楼主你好,这个问题要工作了才能解决
作者: 浮出一个美    时间: 2014-1-3 10:21
jibenwujie 发表于 2014-1-3 10:17
楼主你好,这个问题要工作了才能解决

你是黑马姐姐吗?我现在正在努力查漏补缺知识中。
经过黑马的培训,是否会浴火重生?,火鸡变凤凰?
作者: jibenwujie    时间: 2014-1-3 10:25
浮出一个美 发表于 2014-1-3 10:21
你是黑马姐姐吗?我现在正在努力查漏补缺知识中。
经过黑马的培训,是否会浴火重生?,火鸡变凤凰? ...

{:soso__18103388967728070555_4:} ,  俺是男淫
作者: 高亮亮    时间: 2014-1-4 21:07
对于楼主的问题,我其实也想过,这个时候用一个集合对这些元素进行封装,到时候反序列化时,只需要获得该集合即可.
而且,用集合封装对象,在序列化时候,就算有种类不同的对象序列化,也可以通过集合的封装,导入到同一个字节文件中,反序列化时得到集合可以很方便的分离对象.
当然,这里我特地翻了很久API,我查看了大概所有集合(具体实现子类)都是实现Serializable接口的.所有都是可以序列化的.不过我认为用ArrayList存储最好,分离方便.
这样不存在反序列话如何判空问题了.因为只要读一个对象,就是一个集合对象.

但我也有个疑惑,就是我总在想,序列化,反序列化的使用不是应该有大的局限性么?
就是:反序列化方必须是已知这个序列化后的字节文件中所存储对象的类,否则无法用明确的类型引用来接收反序列化读取的该对象.







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2