程序运行时可能有需要保存的数据,对于基本数据类型如int、float、char等,可以简单的保存到文件中,程序下次启动时,可以读取文件中的数据初始化程序。但是对于复杂的对象类型,如果需要永久保存,使用上述方法就会复杂一些,需要把对象中不同的属性分解为基本数据类型,然后分别保存到文件中。当程序再次运行时,需要建立新的对象,然后从文件中读取与对象有关的所有数据,再使用这些数据分别为对象的每个属性进行初始化。
使用对象输入输出流实现对象序列化,可以直接存取对象。将对象存入一个流称为序列化,而从一个流将对象读出来被称为反序列化。
ObjectInput与ObjectOutput
ObjectInput接口与ObjectOutput接口分别继承了DataInput和DataOutput接口,提供了对基本数据类型和对象序列化的方法。使用对象序列化功能可以非常方便地将对象写入输出流,或者从输入流对象读取对象。ObjectInput接口与ObjectOutput接口中定义的对象反序列化和序列化方法如下:
1.readObject()
所谓反序列化就是从输入流中获取序列化的对象数据,用这些数据生成新的Java对象。该方法定义在ObjectInput接口中,由ObjectInputStream类实现。
语法如下:
Object object=readObject();
object:Java对象。
注意:使用readObject()方法获取的序列化对象是Object类型的,必须通过强制类型转换才能使用。
2.writeObject()
序列化就是将对象写入到输入流,这个输入流可以是文件输出流、网络输出流以及其他数据输出流。该方法定义在ObjectOutput接口中,由ObjectOutputStream类实现。
语法:
writeObject(Object);
object:将要序列化的对象。
注意:被序列化的对象必须实现java.io.Serializable,否则不能实现序列化。
ObjectInputStream与ObjectOutputStream
Java提供了ObjectInputStream和ObjectOutputStream类读取和保存对象,他们分别是对象输入流和对象输出流。ObjectInputStream类和ObjectOutputStream类是InputStream和OutputStream类的子类,继承了他们所有的方法。
ObjectInputStream类的构造方法为:
ObjectInputStream(InputStream in)
当准备读取一个对象到程序中时,可以用ObjectInputStream类创建对象输入流。
语法如下:
new ObjectInputStream(in)
ObjectInputStream类读取基本数据类型的方法为:
readObject()
对象输入流使用该方法读取一个对象到程序中。例如:
FileInputStream fis=new FileInputStream("Example.txt");
ObjectInputStream ois=new ObjectInputStream(fis);
ois.readObject();
ois.close();
ObjectOutputStream类的构造方法为:
ObjectOutputStream(OutputStream out)
当准备将一个对象写入到输出流(即序列化),可以用ObjectOutputStream类创建对象输出流。
语法如下:
new ObjectOutputStream(out)
ObjectOutputStream类写入基本数据类型的方法为:
writeObject()
对象输出流使用该方法将一个对象写入到一个文件中。例如:
FileOutputStream fos = new FileOutputStream("Example.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject("Example");
oos.close();
下面给出一个完整示例,该示例实现对用户密码的修改。
public class Example {
public static void main(String[] args) {
User user = new User("Tom", "111", 21);
try {
FileOutputStream fos = new FileOutputStream("C:\\Example.txt");
//创建输出流对象,使之可以将对象写入文件中
ObjectOutputStream oos = new ObjectOutputStream(fos);
//将对象写入文件
oos.writeObject(user);
System.out.println("修改之前用户的信息:");
System.out.println("用户名:" + user.name);
System.out.println("原密码:" + user.password);
System.out.println("年龄:" + user.age);
FileInputStream fis = new FileInputStream("C:\\Example.txt");
//创建输入流对象,使之可以从文件中读取数据
ObjectInputStream ois = new ObjectInputStream(fis);
user = (User) ois.readObject();
user.setPassword("222");
System.out.println("修改之后的用户信息:");
System.out.println("用户名:" + user.name);
System.out.println("修改之后的密码:" + user.password);
System.out.println("年龄:" + user.age);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class User implements Serializable {
String name;
String password;
int age;
User(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
public void setPassword(String password) {
this.password = password;
}
}
运行结果如图所示:
由图可知,通过序列化和反序列化实现了用户密码的修改