当我们创建了一个model对象的时候,必须每次要给它set进去值之后才能取里面的值,那么我们想能不能只Set一次值,将这个对象持久化一下,不用每次Set就可以得到值呢。当然可以,这就要把对象用对象流ObjectStream,以I/O的方式写到文件中,然后再读取,就实现了对象的可持久化。
public class TestObjectStream {
//往文件中写对象
public static void writeObject(Object o) throws Exception{
OutputStream out=new FileOutputStream("c:\\1.txt");
ObjectOutputStream oos=new ObjectOutputStream(out);
oos.writeObject(o);
oos.flush();
oos.close();
}
//从文件中读取对象
public static void readObject() throws Exception{
FileInputStream fis=new FileInputStream("c:\\1.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
Object o=ois.readObject();
Book b=(Book) o;
System.out.println(b.getId());
System.out.println(b.getName());
ois.close();
fis.close();
}
public static void main(String[] args) throws Exception {
Book b=new Book();
b.setId(1);
b.setAuthor("bruce");
b.setName("java 编程思想");
b.setPrice(101.00);
writeObject(b);
readObject();
}
}
代码解释:Book是已创建好的model,为里面赋好值,然后将Book这个对象写出去,writeObject是将对象写出去的方法,给我一个对象我就写出去。
ObjectOutputStream 必须提供一个outputstream参数,就是往哪个位置去写,然后调用writeobject方法将对象写出去,最后关闭连接。
readObject读方法,当我从文件中读取对象的时候,也需要为ObjectInputStream提供一个inputstream这种是典型的包装流。然后调用readobject方法读取对象,读取完之后我们将对象转换为Book类型,直接可以取出里面的值。
如果此时运行该程序会报一个错误java.io.NotSerializableException没有序列化的问题,这时候需要注意,如果一个对象要以I/O的方式去写,就必须实现一个接口Serializable,实现这个借口之后就代表着这个对象可被序列化,什么是序列化--》就是对象可以以I/O的方式去写。另外这个Serializable是一个标记性接口,里面什么方法都没有,什么是标记性接口?--》就是一个类如果实现了这个接口JVM就会认为这个类能做这件事,Book这个类实现了Serializable这个接口,JVM就会认为,Book这个类可以被序列化,之前还有一个接口Colenable,当我要克隆一个对象的时候只要实现这个接口然后super.clone();什么都不做就代表着这个对象可以被克隆。
思考:可不可以往一个文件中写入多个对象,如果可以,那么是怎样读取的。如果不可以是为什么。