黑马程序员技术交流社区

标题: 关于对象流ObjectInputStream循环读取的问题,求解 [打印本页]

作者: 月老~牵红线    时间: 2014-12-18 11:46
标题: 关于对象流ObjectInputStream循环读取的问题,求解
本帖最后由 月老~牵红线 于 2014-12-18 14:46 编辑

今天在做操作对象流ObjectInputStreamObjectOutputStream的练习的时候,碰到一个关于循环读取的小问题。下面是我的代码。
  1. import java.io.*;
  2. import java.util.*;
  3. //定义学生类
  4. class Student implements Serializable
  5. {
  6.         public static final long serialVersionUID = 42L;
  7.         //自己定义UID,保证UID唯一
  8.         private String name;
  9.         private int age;
  10.         Student(String name,int age)
  11.         {
  12.                 this.name=name;
  13.                 this.age=age;
  14.         }
  15.         public String toString()
  16.         {
  17.                 return name+":"+age;
  18.         }
  19. }
复制代码
  1. //添加对象
  2.         public static void writeObj()throws IOException
  3.         {
  4.                 ObjectOutputStream oos=
  5.                         new ObjectOutputStream(new FileOutputStream("C:\\obj.txt"));
  6.                 oos.writeObject(new Student("wangwu",23));
  7.                 oos.writeObject(new Student("lisi",25));
  8.                 oos.close();
  9.         }
复制代码
  1. public static void readObj()throws Exception
  2.         {
  3.                 ObjectInputStream ois=new ObjectInputStream(new FileInputStream("C:\\obj.txt"));        
  4.                 //循环读取
  5.                 Object obj=null;
  6.                 try
  7.                 {
  8.                         while ((obj=ois.readObject())!=null)
  9.                         {               
  10.                                 Student stu=(Student)ois.readObject();
  11.                                 System.out.println(stu);                                
  12.                         }
  13.                 }
  14.                 catch (EOFException e)
  15.                 {
  16.                         System.out.println("到达文件结尾");
  17.                 }
  18.         }
复制代码
数据都读出来了,但是抛出了EOFException。

请教这个异常要处理么,该怎么处理啊?

作者: 沙子    时间: 2014-12-18 11:53
牛人,我这才刚看到面向对象,看来要努力了。
作者: jacoblx    时间: 2014-12-18 13:25
while ((obj = ois.readObject()) != null) {
        Student stu = (Student) ois.readObject();
        System.out.println(stu);

你每读两次才输出一次?
把        Student stu = (Student) ois.readObject();
这句删了吧
直接输出obj就好了啊
作者: 月老~牵红线    时间: 2014-12-18 13:38
jacoblx 发表于 2014-12-18 13:25
while ((obj = ois.readObject()) != null) {
        Student stu = (Student) ois.readObject();
        ...

为什么说是读了两次输出一次,不应该读一次输出一次么?还有,抛出的EOFException异常该怎么处理啊?
作者: jacoblx    时间: 2014-12-18 13:42
月老~牵红线 发表于 2014-12-18 13:38
为什么说是读了两次输出一次,不应该读一次输出一次么?还有,抛出的EOFException异常该怎么处理啊? ...

异常我再看看。你while条件里读了一次到obj,接下来又读了一次到stu。。。
作者: jacoblx    时间: 2014-12-18 13:52
月老~牵红线 发表于 2014-12-18 13:38
为什么说是读了两次输出一次,不应该读一次输出一次么?还有,抛出的EOFException异常该怎么处理啊? ...

我看了下API,readObject方法不能通过返回值!=null来判断文件末尾,因为他没办法知道读到的对象是属于什么类,也就无法判断文件末尾。所以尽量用循环次数来控制。比如for (int i = 0; i < 2; i++)这样的循环
作者: 月老~牵红线    时间: 2014-12-18 14:12
jacoblx 发表于 2014-12-18 13:42
异常我再看看。你while条件里读了一次到obj,接下来又读了一次到stu。。。

Student stu=(Student)obj;之前写错了,我只是想实现转型,:L忽略这一句,帮我解决异常吧




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