一:引言
目录
开始正文前我们需要来思考一个问题,怎么将下列的一个信息保存到本地文件中去
public static void main(String[] args) throws IOException {
User u = new User("涛涛","beautiful");
BufferedWriter bw = new BufferedWriter(new FileWriter("day11//b.txt"));
bw.write(u.getUsername());
bw.newLine();
bw.write(u.getPassword());
bw.close();
}
通过上面的代码我们可以将信息写入到本地文件上,现在我们只想要保管用户信息,现在只要谁能找到我这个b.txt文件就能查看我保存的用户信息,这样的话数据是非常的安全。所以我们引出了对象操作流。
二:对象操作流
2.1对象操作流的特点:
可以把对象以字节的形式写到本地文件,直接打开这个文件,是读不懂的,需要再次用对象操作流读到内存中。
2.2对象操作流分类:
- 对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输。
- 对象操作输入流(对象反序列化流):把本地文件中的对象读到内存中,或者接收网络中传输的对象。
下面我们正式开始讲解对象操作流。
我们需要创建一个JavaBean对象
2.3对象序列化
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
public static void main(String[] args) throws IOException {
User user = new User("taotao","dahuaibi");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day11\\b.txt"));
oos.writeObject(user);
oos.close();
}
问题:
大家觉得运行上面一段代码会不会出错呢?
在这里我告诉大家这是会报出一个NotSerializableException异常的。如下图
通过查阅API我们知道,是因为我们这个对象没有被序列化
解决方案:
如果想要User类的对象能够被序列化,那么这个类必须要实现一个接口,即Serializable接口
再来运行代码,是不会报错了,并且成功写入了b.txt中。如下图
我们实现了这个Serializable接口是不是要重写里面的方法呢?这样我带大家看一下源码就知道是不要重写的,是因为Serializable接口里没有抽象方法。
Serializable接口的意义:
Serializable是一个标记性的接口,里面没有任何的抽象方法。
只要一个类实现了这个Serializable接口,那么就表示这个类的对象可以被序列化。
2.4反序列化
代码实现:
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day11\\b.txt"));
User o = (User) ois.readObject();
System.out.println(o);
ois.close();
}
将上文中的对象反序列化,打印出来,如下图。