输入输出流以及序列化和session
- 在Java 语言中,ObjectOutPutStream 是指
a. 字节流
b. 字符流
c. 对象输出流
d. 数据流
输入和输出流
I/O流
—1.字节流 InputStream (读非字符数据 比如图片 音频等) –读字节 是所有字节输入流的超类 每次读取一个字节 (8bit) 与OutputStream对应
最常用 FileInputStream
核心 :
ObjectInputStream 对象输入字节流
可以把对象存储到硬盘中 —序列化后存储
读取硬盘中的对象—反序列化后读取
ObjectOutPutStream 对象输出字节流
—2.字符流Reader 用于读取字符流的抽象类 (双字节读取)一个字符两个字节 —-只能读取字符
子类:BufferReader (缓冲 效率比较高)
序列化和反序列化
例子
/*
* 演示对象输入输出流,理解序列化的概念
* */
public class ObjectStreamTest {
public static void main(String[] args) throws Exception {
//ObjectStreamTest.writeObject();
ObjectStreamTest.readObject();
}
//读出
public static void readObject() throws Exception {
ObjectInputStream read=new ObjectInputStream(new FileInputStream("C:/student.o"));
Student s1=(Student)read.readObject();
Student s2=(Student)read.readObject();
System.out.println(s1 + "," + s2);
}
//写入
public static void writeObject() throws Exception {
ObjectOutputStream write =new ObjectOutputStream(new FileOutputStream("c:/student.o"));
write.writeObject(new Student(1, "aa"));
write.writeObject(new Student(2, "bb"));
write.close();
}
}
实体类对象
// 内存--->硬盘 就是转化为二进制的过程 (序列化过程)
public class Student implements Serializable{//必须实现Serializable接口,否则无法存入硬盘
//序列号 :生成唯一标识号
private static final long serialVersionUID = 3326694874182755921L;
@Override
public String toString() {
return "Student [id=" + id + ", age=" + age + "]";
}
private int id;
private String age;
public Student(int id, String age) {
super();
this.id = id;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
- 序列化和反序列化在web项目中的应用场景
Web服务器中work目录下边有可序列化的session文件
web服务器关闭 session并没有销毁,session被持久化(序列化)到硬盘 生成文件,并在web服务器重新启动后 将硬盘中的文件反序列化到内存中,前提序列化和反序列化的对象必须实现Serializable接口
session销毁的条件
1.浏览器关闭,30分钟没有跟服务器段进行交互 session声明周期过期
2.session有销毁的方法
用户在登陆状态保持session,停掉web服务器,session并没有销毁,而在重启web服务器后 session依然会被反序列化到内存,重新刷新页面,依然在登录状态。重新打开浏览器(清除缓存 session失效)则在非登陆状态。
如果强制修改序列化号,则重启web服务器则会报反序列化报错
、