本帖最后由 丁岩 于 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>本身了,这样就有效的规避了上面出现的问题,最后读取的时候也能读取到多个对象了。下面我分享一下我的源代码,欢迎大家多提宝贵意见!!!- package TestIO;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.util.Scanner;
- public class Seriz
- {
- public static void main(String[]args) throws FileNotFoundException, IOException, ClassNotFoundException
- {
- RW rw=new RW();
- System.out.println("请输入要存储的学生数量:");
- Scanner in=new Scanner(System.in);
- int num=in.nextInt();
- rw.writeIO(num);
- rw.readIO();
- }
- }
复制代码- package TestIO;
- import java.io.Serializable;
- class Student implements Serializable//实现Serializable接口的Student方法,用于对象序列化
- {
- private String name;
- private int age;
- private String pro;
- private float score;
- public Student(String name, int age, String pro, float score) {
- super();
- this.name = name;
- this.age = age;
- this.pro = pro;
- this.score = score;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public String getPro() {
- return pro;
- }
- public float getScore() {
- return score;
- }
- }
复制代码- package TestIO;
- 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.Scanner;
- class RW
- {
- public ArrayList<Student> al=new ArrayList<Student>();
- void Rw()
- {
- }
- public void writeIO(int num) throws FileNotFoundException, IOException
- {
- for(int i=0;i<num;i++)
- {
- System.out.println("请依次输入第"+(i+1)+"名学生的姓名、年龄、课程、分数:");//读取键盘录入
- Scanner in=new Scanner(System.in);
- String name=in.next();
- int age=in.nextInt();
- String pro=in.next();
- float score=in.nextFloat();
- Student stu=new Student(name,age,pro,score);
- al.add(stu);//存储到集合中
- }
- ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("C:\\Student.log"));//建立路径
- oos.writeObject(al);//存储集合对象到指定路径文件
- oos.close();
- System.out.println("存储成功");
- }
- public void readIO() throws FileNotFoundException, IOException, ClassNotFoundException
- {
- ObjectInputStream ois=new ObjectInputStream(new FileInputStream("C:\\Student.log"));//读取对象
- ArrayList<Student> al2=(ArrayList<Student>)ois.readObject();
- ois.close();
- int i=0;
- System.out.println("开始读取:");
- for(Student stu:al2)//依次显示对象信息
- {
- stu=al2.get(i);
- System.out.println("第"+(i+1)+"名学生信息:name="+stu.getName()+"\t"+"age="+stu.getAge()+"\t"+"pro="+stu.getPro()+"\t"+"score="+stu.getScore());
- i++;
- }
- }
- }
复制代码 |
|