黑马程序员技术交流社区
标题:
关于对象序列化和集合存储对象的思考
[打印本页]
作者:
丁岩
时间:
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>本身了,这样就有效的规避了上面出现的问题,最后读取的时候也能读取到多个对象了。下面我分享一下我的源代码,欢迎大家多提宝贵意见!!!
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++;
}
}
}
复制代码
QQ截图20121104104645啊啊啊.jpg
(36.05 KB, 下载次数: 19)
下载附件
2012-11-4 10:53 上传
作者:
朱宏青
时间:
2012-11-4 12:27
好支持顶.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2