A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 月老~牵红线 于 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。

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

6 个回复

倒序浏览
沙子 来自手机 中级黑马 2014-12-18 11:53:38
沙发
牛人,我这才刚看到面向对象,看来要努力了。
回复 使用道具 举报
while ((obj = ois.readObject()) != null) {
        Student stu = (Student) ois.readObject();
        System.out.println(stu);

你每读两次才输出一次?
把        Student stu = (Student) ois.readObject();
这句删了吧
直接输出obj就好了啊
回复 使用道具 举报
jacoblx 发表于 2014-12-18 13:25
while ((obj = ois.readObject()) != null) {
        Student stu = (Student) ois.readObject();
        ...

为什么说是读了两次输出一次,不应该读一次输出一次么?还有,抛出的EOFException异常该怎么处理啊?
回复 使用道具 举报
月老~牵红线 发表于 2014-12-18 13:38
为什么说是读了两次输出一次,不应该读一次输出一次么?还有,抛出的EOFException异常该怎么处理啊? ...

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

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

Student stu=(Student)obj;之前写错了,我只是想实现转型,:L忽略这一句,帮我解决异常吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马