- 输入输出流的划分是相对于程序而言的,并不是相对数据源,流入程序的的数据叫输入流,程序将数据经过加工处理之后输出至目的源的数据流叫做输出流
- InputStream/OutputStream和Reader/Writer类是所有IO流类的抽象父类
- 分类:
1.按流的方向分类,分为输入流(以InputStream、Reader结尾的流)、输出流(以OutPutStream、Writer结尾的流)。
2. 按处理的数据类型分类,分为字符流(read或者writer结尾)、字节流(stream结尾)。
3. 按处理对象不同分类:节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream、处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。 - 处理流也叫包装流。节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。
- 数据流将“基本数据类型与字符串类型”作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型。
- Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。
- 对象序列化的作用有如下两种
持久化:把对象的字节序列成字节数组永久地保存到硬盘上,通常存放在一个文件中。
网络通信:在网络上传送对象的字节序列。比如:服务器之间的数据通信、对象传递。 - 只有实现了Serializable接口的类的对象才能被序列化。Serializable接口是一个空接口,只起到标记作用。
通过ObjectOutputStream、ObjectInputStream、ByteArrayInputStream、ByteArrayOutputStream序列化对象。(字节数组)
序列化
public <T> byte[] serialize(T obj) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("序列化失败");
}
byte[] bytes = baos.toByteArray();
return bytes;
}
反序列化
public <T> T deSerialize(byte[] buffer, Class<T> clazz) {
ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
try {
ObjectInputStream ois = new ObjectInputStream(bais);
return (T) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("反序列化失败");
}
}
9.Java的序列化机制是通过判断类的 serialVersionUID 来验证版本一致性的。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID与本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是 InvalidCastException如果没有为指定的 class 配置 erialVersionUID,那么 java 编译器会自动给这个 class 进行一个摘要算法,类似于指纹算法,只要这个文件有任何改动,得到的 UID 就会截然不同的,可以保证在这么多类中,这个编号是唯一的
10. 序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。
11. 浅克隆:实现clone接口,在拷贝的时候,并没有创建一个新的对象,拷贝的是内存地址值,对于引用类型和对象,还是同一个对象
12. 深度克隆:将对象序列化(在内存中操作)之后,再序列化加载到JVM中,JVM会重新开辟一个新的空间。这样拷贝的引用类型的内存地址变化,就不是同一个对象了,
public User deepClone(){
ISerialize serialize=new JdkSerialize();
byte[] bytes = serialize.serialize(this);
return serialize.deSerialize(bytes,User.class);
}