很多时候需要将一些类对象本地化,例如我们训练了某个学习器,学习器在面向对象编程中必然是某个类对象,我们需要将其存储下来,jdk为我们提供了现成的序列化方法,比cpp方便很多,也不需要再自己写一些专门用于读取本地数据的构造函数。
jdk为我们提供了两个过滤流分别是ObjectOutputStream和ObjectInputStream,前者用于将对象序列化,通常写为.dat文件,后者用从.dat文件中读取数据并重建。二者都是过滤流,内部要包装基础流。下面上一个简单的代码。
package ttt;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class boyyy implements Serializable{
String name;
public boyyy(String name){
this.name=name;
}
public String getName(){
return this.name;
}
}
public class testtt6 {
public static void main(String[] args) {
//分别定义输出流和数入流。
FileOutputStream fout=null;
ObjectOutputStream obout=null;
FileInputStream fin=null;
ObjectInputStream obin=null;
try{
fout=new FileOutputStream("/home/wangzheng/java_test/data.dat");
obout=new ObjectOutputStream(fout);
boyyy b1=new boyyy("nio");
//调用原本的方法。
System.out.println(b1.getName());
//写到本地。
obout.writeObject(b1);
obout.flush();
obout.close();
fin=new FileInputStream("/home/wangzheng/java_test/data.dat");
obin=new ObjectInputStream(fin);
//从本地读入,因为readObject()返回值是object类型,作一个显式的向下转换。
boyyy b2=(boyyy)obin.readObject();
//调用重构后的方法。
System.out.println(b2.getName());
obin.close();
}catch(IOException e){
System.out.println("IOException");
e.printStackTrace();
}catch(ClassNotFoundException e){
System.out.println("ClassNotFoundException");
}
}
}
输出结果如下,二者显示了相同的数据nio。