黑马程序员技术交流社区

标题: 关于对象序列化和集合存储对象的思考 [打印本页]

作者: 丁岩    时间: 2012-11-4 10:47
标题: 关于对象序列化和集合存储对象的思考
本帖最后由 丁岩 于 2012-11-4 10:53 编辑

     除了选择用数据库存储数据以外,如何用别的形式存储对象呢?于是我想到了用文件的形式存储到计算机上。由于是需要存储对象,那么应用对象序列化,可以原汁原味的将对象整体存储到文件中,并且恢复对象,读取起来也十分方便。但是第一次做实验的时候,发现应用对象序列化的readObject,只能读取到最新的那一个对象。什么意思呢?举个例子,比如我建立了3个Student对象 stu1、stu2、stu3,当我赋值完准备用writeObject方法存储的时候,嗯~这个很成功,没有出现什么问题。但是当我用readObject试图读取Student对象信息的时候,我发现读取出来的只有stu3的学生信息。经验证我才发现,由于我是按照stu1、stu2、stu3这样的顺序存储的,很遗憾的是它每一次都覆盖了前一个对象,从而导致我最后读取的只能是最后存储的对象。。。因此只读取到了stu3。(悲剧啊~~~~),那不是很坑爹吗?难道没有解决方法吗?后来我在网上查阅了一些资料,发现由于对象序列化存储于读取的返回类型都是Object。大家也知道Object,那就是上帝也是万能类型啊。多个对象的存储可以用集合的方式,这里我选择了ArrayList,然后我最后存储的对象本身不再是Student,而是ArrayList<Student>本身了,这样就有效的规避了上面出现的问题,最后读取的时候也能读取到多个对象了。下面我分享一下我的源代码,欢迎大家多提宝贵意见!!!
  1. package TestIO;

  2. import java.io.FileNotFoundException;
  3. import java.io.IOException;
  4. import java.util.Scanner;

  5. public class Seriz
  6. {
  7. public static void main(String[]args) throws FileNotFoundException, IOException, ClassNotFoundException
  8. {
  9. RW rw=new RW();
  10. System.out.println("请输入要存储的学生数量:");
  11. Scanner in=new Scanner(System.in);
  12. int num=in.nextInt();


  13. rw.writeIO(num);
  14. rw.readIO();


  15. }


  16. }
复制代码
  1. package TestIO;

  2. import java.io.Serializable;


  3. class Student implements Serializable//实现Serializable接口的Student方法,用于对象序列化
  4. {
  5. private String name;
  6. private int age;
  7. private String pro;
  8. private float score;
  9. public Student(String name, int age, String pro, float score) {
  10. super();
  11. this.name = name;
  12. this.age = age;
  13. this.pro = pro;
  14. this.score = score;
  15. }
  16. public String getName() {
  17. return name;
  18. }

  19. public int getAge() {
  20. return age;
  21. }

  22. public String getPro() {
  23. return pro;
  24. }

  25. public float getScore() {
  26. return score;
  27. }


  28. }
复制代码
  1. package TestIO;

  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;
  8. import java.util.ArrayList;
  9. import java.util.Scanner;

  10. class RW
  11. {

  12. public ArrayList<Student> al=new ArrayList<Student>();
  13. void Rw()
  14. {

  15. }
  16. public void writeIO(int num) throws FileNotFoundException, IOException
  17. {
  18. for(int i=0;i<num;i++)
  19. {
  20. System.out.println("请依次输入第"+(i+1)+"名学生的姓名、年龄、课程、分数:");//读取键盘录入
  21. Scanner in=new Scanner(System.in);
  22. String name=in.next();
  23. int age=in.nextInt();
  24. String pro=in.next();
  25. float score=in.nextFloat();
  26. Student stu=new Student(name,age,pro,score);
  27. al.add(stu);//存储到集合中
  28. }
  29. ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("C:\\Student.log"));//建立路径


  30. oos.writeObject(al);//存储集合对象到指定路径文件
  31. oos.close();
  32. System.out.println("存储成功");
  33. }

  34. public void readIO() throws FileNotFoundException, IOException, ClassNotFoundException
  35. {

  36. ObjectInputStream ois=new ObjectInputStream(new FileInputStream("C:\\Student.log"));//读取对象
  37. ArrayList<Student> al2=(ArrayList<Student>)ois.readObject();
  38. ois.close();
  39. int i=0;
  40. System.out.println("开始读取:");
  41. for(Student stu:al2)//依次显示对象信息
  42. {

  43. stu=al2.get(i);
  44. System.out.println("第"+(i+1)+"名学生信息:name="+stu.getName()+"\t"+"age="+stu.getAge()+"\t"+"pro="+stu.getPro()+"\t"+"score="+stu.getScore());
  45. i++;

  46. }
  47. }

  48. }
复制代码

QQ截图20121104104645啊啊啊.jpg (36.05 KB, 下载次数: 19)

QQ截图20121104104645啊啊啊.jpg

作者: 朱宏青    时间: 2012-11-4 12:27
好支持顶.




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