IO
1.IO模型
1.1 BIO
同步并阻塞。服务器实现一个连接一个线程,客户端在有连接请求时服务器启动一个线程处理,没处理完不能做其他操作。
适用于连接数目小且固定的架构。
- 面向流,只能单向读写,没有数据时会挂起线程阻塞等待,需要对每个连接新建线程处理
1.2 NIO
同步非阻塞。服务器实现一个连接一个线程,客户端发送的请求注册到多路复用器上,轮询到有IO请求才启动线程处理。
适合连接数目多且连接短的架构。
- 面向缓冲,可以双向读写,进行多路复用,一个线程监听多个连接
1.3 AIO
异步非阻塞。服务器一个有效请求一个线程,客户端请求由操作系统完成后通知服务器启动线程。
适用于连接数目多且长的架构
1.4 Netty
- 提供异步事件驱动的网络应用程序框架和工具,用以快速开发高性能,高可靠的网络服务器和客户端程序。
- 基于NIO的客户服务器框架,快速开发网络应用
1.5 信号驱动IO
1.6 IO多路转接
2.Java IO流
2.1 读写单位
2.1.1 字符流:字符为单位,16位数据 char
- 节点流Reader
/**
* 节点流
*/
public void NodeStream() throws Exception{
int num = 0;
//必须存在 read()自动吧char转化为int
FileReader fileReader = new FileReader("C:\\Users\\lwx20\\Desktop\\Java\\Foundation\\IO\\test.txt");
//第一种
char[] buf = new char[1024];
while ((num = fileReader.read(buf)) != -1) {
System.out.print((new String(buf,0,num)));
}
//第二种
while ((num = fileReader.read()) != -1) {
System.out.print((char)num);
}
}
- 处理流Reader
/**
* 处理流
*/
public void handlerStream() throws Exception{
String[] bufString = new String[1024];
int num = 0;
FileReader fileReader = new FileReader("C:\\Users\\lwx20\\Desktop\\Java\\Foundation\\IO\\test.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = null;
//readLine 单行读取
while ((line = bufferedReader.readLine()) != null){
bufString[num] = line;
num++;
}
bufferedReader.close();
for (int i = 0; i < num; i++){
System.out.println(bufString[i]);
}
}
2.1.2 字节流:字节为单位,8位 byte
2.2 流的方向
- 输出流
- 输入流
2.3 角色
- 节点流:直接与数据源相连
- 处理流:对已经存在的流进行封装,如Buffering缓冲区
3.序列化
- 序列化:二进制形式保存在硬盘上
- 反序列化: 二进制文件转化为对象读取
3.1 Serializable接口
- SerialVersionUID: 接口默认生成,默认生成在反序列化时可能会导致InvaildClassException异常(序列化与反序列化比对通过UID进行,反序列化之前修改类,就会报错)
- static final long SerialVersionUID =