对象流
对象流是一对高级流,可以对java中的任何对象进行读写
将对象读写到文件中
先新建一个Person类
public class Person implements Serializable{
private static final long serialVersionUID = 1L;//这个叫序列化版本号,影响着反序列化是不是能够成功
private String name;
private int age;
private String gender;
private transient String[] otherInfo;
/*
* 当一个属性使用transient修饰后,那么进行序列化时这个值会被忽略,
* 忽略不必要的属性可以达到对象序列化瘦身操作,减少不必要的资源开销
*/
public Person(String name, int age, String gender, String[] otherInfo) {
super();
this.name = name;
this.age = age;
this.gender = gender;
this.otherInfo = otherInfo;
}
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + ", otherInfo="
+ Arrays.toString(otherInfo) + "]";
}
}
现在,new一个Person对象,给它的属性赋值
String name = "老师";
String gender = "女";
int age = 18;
String[] otherInfo = {"是一名教师"+"已婚"};
Person p = new Person(name,age,gender,otherInfo);
因为对象流是高级流,所以它必须叠加在低级流上
FileOutputStream fos = new FileOutputStream("person.obj");
ObjectOutputstream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close;
如此,便能把new出来的一个Person对象保存到“person.txt”文件中。
下面解释在此程序执行中包涵的两个过程:
①序列化:当对象经过OOS写出时,将该对象按照结构转换为一组字节,这个过程称为:对象序列化
②数据持久化:当序列化的这组字节经过fos写入到文件中时,此字节可以在磁盘上得到永久保存(后续删除之类的操作不算),这个过程称为数据持久化。
把刚刚保存在“person.obj”文件中的内容读到控制台上就相对容易理解了。
//从person.obj文件中反序列化java对象
FileInputStream fis = new FileInputStream("person.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
System.out.println("写出完毕");
oos.close();
值得注意的是,
①一个类若希望被对象流读写,那么这个类必须要实现接口:serializable
②当一个属性使用transient修饰后,那么进行序列化时这个值会被忽略,忽略不必要的属性可以达到对象序列化瘦身操作,减少不必要的资源开销。(比如玩游戏的时候周围的小怪,都不会存档的,再次打开游戏的时候周围的小怪等会重新生成)③对象流没有按字符集读、写这个操作。