Java BIO/NIO/AIO流
一、IO流
1. 定义:IO流用来处理设备之间的数据传输,在java程序中,对于数据的输入/输出操作都是以“流”的方式进行;
2. 分类
A. 按流的方向分
输入流:程序从数据源读取数据的流;
输出流:程序向数据源写出数据的流;
B. 按流的内容(传输方式)分
字节流:以字节为单位传输数据的流;
字符流:以字符为单位传输数据的流;
C. 按流的操作类型分
文件流:用于程序和文件之间的数据传输;
数组流:以字节数组形式传输
转换流:用于在字节流和字符流之间进行转换
管道流:
缓冲流:对读写的数据提供了缓冲的功能,用于提高读写的效率,请注意:对于缓冲输出流,写出的数据会缓存在内存缓存区内,关闭之前要用flush()方法将缓存区的数据强制立即写出,调用close()方法,不但会关闭流,还会在关闭流之前刷新缓冲区。
3. 字节流(InputStream / OutputStream)
A. 分类
文件字节流:FileInputStream、FileOutputStream
数组字节流:ByteArrayInputStream、ByteArrayOutputStream
缓冲字节流:BufferedInputStream、BufferedOutputStream
管道字节流:PipedInputStream、PipedOutputStream
B. 使用场景:适合对图片、音乐、视频、压缩包等文件的拷贝
4. 字符流(Reader / Writer)
A. 分类
文件字符流:FileReader、FileWriter
数组字符流:CharArrayReader、CharArrayWriter
缓冲字符流:BufferedReader、BufferedWriter,其中readLine()方法用于一行行的读取,newLine()方法用于写出一个行分隔符
管道字符流:PipedReader、PipedWriter
B. 使用场景:适合对文本文件的读取和拷贝;
5. 转换流
A. 分类
InputStreamReader:将输入的字节流变成字符流;
OutputStreamWriter:将输出的字符流变成字节流;
6. 概念组
A. 阻塞IO和非阻塞IO:属于程序级别的,描述程序请求操作系统IO操作后,如果IO资源没有准备好,对于阻塞体现为等待,对于非阻塞体现为继续执行,即使用线程一直轮询,直到IO资源准备好了;
B. 同步IO和非同步IO:属于操作系统级别的,描述操作系统在收到程序请求IO操作后,如果IO资源没有准备好,同步体现为不响应,直到IO资源准备好以后,非同步体现为返回一个标记,程序监听,当IO资源准备好之后,再用事件机制返回给程序。
二、BIO
1. 定义:BIO即Blocking IO,属于同步阻塞的IO,传统的IO模型,依赖于ServerSocket实现,即一个请求对应一个线程,该线程完成数据的输入,业务处理和数据的返回,如果线程数不够连接,则会等待空余线程或拒绝连接;
2. 特点:当并发数很大,就会创建大量的线程,占用很大的系统资源,在线程开销和上下文切换上降低处理性能;当连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源的浪费。
3. 应用场景:适用于连接数比较少且固定架构的应用。
三、NIO
1. 定义:NIO即Non-Blocking IO,属于同步非阻塞的IO,它是基于时间驱动的,采用了Reactor模式,它使用一个线程管理所有的Socket通道,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才会启动一个线程进行处理;
2. 使用:建议使用Netty框架,而非jdk自带的api,因为api使用很复杂;
3. 使用场景:适用于连接数目较大但是连接时间短的应用,如聊天应用。
4. NIO三大核心组件
A. Selector(选择器):可以用一个线程处理多个客户端连接,能够检测多个注册的通道上是否有事件发生;
B. Channel(通道):可以从缓冲读数据,也可以写数据到缓冲;
C. Buffer(缓冲区):是一个读写数据的内存块,能够跟踪和记录缓冲区的状态变化;
D. 组件关系
四、AIO
1. 定义:AIO即Asynchronous IO,是NIO 2.0,属于异步非阻塞的IO,采用了Proactor模式,简化了程序编写,一个有效的请求才启动一个线程,先由操作系统完成后才通知服务端程序启动线程去处理;
2. 应用场景:使用与连接数较多且连接时间长的应用。
五、多路复用IO
1. 定义:多路复用IO即IO Multiplexing,属于异步阻塞IO,采用了Reactor模式,Java中的Selector和Linux中的epoll都是这种模型。
可参考:https://wangning1125.iteye.com/blog/1400146
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗