容易忽视但是功能灰常强大的Java API(二. 读写对象)

二. 读写对象

有时候你会遇到这样的情况:从数据集合中读取数据,解析数据,然后封装成对象,再把对象放到一个集合中,对集合对象进行操作,程序结束。第二次需要运行程序时,又按如上的操作流程做一遍。第三次,每四次…每一次都执行相同的操作。又或者会遇到这样的情况:程序运行过程中会产生一些对象的集合,我们只对这个对象集合感兴趣,而对它是如何生成的不感兴趣。程序结束后第二次你又需要这个对象集合时,又要重新生成这个对象集合。

当你遇到这样的情况时,你有没有想过这样可能会造成系统资源的浪费,会影响功能实现的效率,那你有没有考虑过一个更好的做法来解决这个问题。事实上,这个问题可以通过java提供的实现对象读写的两个类来解决,它们是ObjectInputStream和ObjectOutputStream。通过这两个类可以非常方便的实现将对象以序列化的格式写入到文件或者是从文件读取序列化的数据来直接生成对象,这两个类操作的对象必须是可以序列化的。因此,可以利用这两个类来保存中间结果到文件中,当需要时再从文件中直接读取出中间结果,这样可以在一定程度上提高程序功能的实现效率。下面是一个例子:

public class ObjectIOStreamTest implements Serializable {    
    public static void main(String[] args) throws Exception {     
        ObjectIOStreamTest test = new ObjectIOStreamTest();     
        Set num = new HashSet();     
        num.add(test.new Student(1, "a"));     
        num.add(test.new Student(2, "b"));     
        num.add(test.new Student(3, "c"));     
       FileOutputStream fos = new FileOutputStream("test");        
        ObjectOutputStream oos = new ObjectOutputStream(fos);         
        oos.writeObject(num);

       FileInputStream fis = new FileInputStream("test");        
        ObjectInputStream ois = new ObjectInputStream(fis);         
        Set num2 = new HashSet();         
        num2 = (Set) ois.readObject();         
        Iterator it = num2.iterator();     
        while (it.hasNext()) {     
            Student stu = it.next();     
            System.out.println(stu.getId() + " " + stu.getName());     
        }     
    }

    public class Student implements Serializable {    
        private int id;     
        private String name;

        public Student(int id, String name) {    
            this.id = id;     
            this.name = name;     
        }

        public int getId() {    
            return id;     
        }

        public void setId(int id) {    
            this.id = id;     
        }

        public String getName() {    
            return name;     
        }

        public void setName(String name) {    
            this.name = name;     
        }     
    }     
}

测试结果:

2 b    
3 c     
1 a

感兴趣的读者可以看看生成的test文件,它是以二进制的格式来保存对象的,其中也保存了集合的类型和对象的类型。另外要说明的是,ObjectInputStream和ObjectOutputStream两个类也可以读写复杂的数据对象,但是前提是所涉及的集合及对象都是可序列化的。

posted on 2011-07-01 10:47  GongTao  阅读(397)  评论(0编辑  收藏  举报

导航