问题描述:把多个User对象序列化的存到文件中,如何利用ObjectInputStream循环的读出我所存放的User对象??存取: User user=new User(count,userName,date1);
 ObjectOutputStream oos=null;
 try {
oos=new ObjectOutputStream(new FileOutputStream(file,true));
oos.writeObject(user);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
读取: File file=new File(fileName);
StringBuffer sbuffer=new StringBuffer();
//反序列化读出
ObjectInputStream ois=null;
List<User> list=new ArrayList<User>();
try {
ois=new ObjectInputStream(new FileInputStream(file));
User user=null;
         while((user=(User)ois.readObject())!=null){
list.add(user);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
报错:java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at com.tjise.Test.test(Test.java:39)
at com.tjise.Test.main(Test.java:23)

解决方案 »

  1.   

    while((user=(User)ois.readObject())!=null){
    list.add(user);
    }
    错误的出处;因为ObjectOutputStream有锁机制,一次只能读取一个对象
    正确的做法如下:
    package com.xyj.test;import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;public class UserSerializable2 {
    public static void main(String[] args) {
    // User[] users = new User[] {
    // new User("张三", 20),
    // new User("李四", 21)
    // };
    User user1 = new User("张三", 20);
    User user2 = new User("李四", 21);
    List<User> list = new ArrayList<User>();
    list.add(user1);
    list.add(user2);

    writeObjectToDisk(list);
    readObjectFromDisk();
    }

    public static void writeObjectToDisk(List<User> list) {
    File file = new File("d://user.txt");
    ObjectOutputStream oos = null;
    try {
    oos=new ObjectOutputStream(new FileOutputStream(file, true));
    oos.writeObject(list);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if(oos != null) {
    try {
    oos.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    @SuppressWarnings("unchecked")
    public static void readObjectFromDisk() {
    ObjectInputStream ois = null;
    try {
    ois = new ObjectInputStream(new FileInputStream(new File("d://user.txt")));
    List<User> list = (List<User>)ois.readObject();
    // if(users!=null && users.length>0) {
    // for(int i=0; i<users.length; i++) {
    // System.out.println(users[i].getName()+" "+users[i].getAge());
    // }
    // }
    for(Iterator<User> iter=list.iterator(); iter.hasNext();) {
    User user = iter.next();
    System.out.println(user.getName()+":"+user.getAge());
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } finally {
    if(ois != null) {
    try {
    ois.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }
      

  2.   

    一楼朋友,xuyajun2013
    如果不以集合或数组形式读到文件中,而是一个一个的读到文件中,还有其他方法可以取出全部的对象吗?
      

  3.   

    这样行不package core;import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;public class Test {
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
    ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("D://12.txt"));
    User u;
    for(int i=0;i<2;i++){
     u=new User(""+i);
    out.writeObject(u);
    }
    out.close();

    ObjectInputStream in=new ObjectInputStream(new FileInputStream("D://12.txt"));
    for(int i=0;i<2;i++){
    u=(User) in.readObject();
    System.out.println(u.getName());
    }
    in.close();

    }
    }class User implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = -6057757893905504974L;
    private String name;
    public String getName() {
    return name;
    }
    public User(String name) {
    this.name=name;
    }
    }