IO

lwx_R / 2023-08-18 / 原文

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 =