【I/O通信】Java中的I/O通信机制模型(BIO/NIO/AIO)

目录

什么是I/O?为什么要处理I/O操作?

什么是流?

Java流的分类

Java中的NIO,BIO,AIO分别是什么


什么是I/O?为什么要处理I/O操作?

        I/O(Input/Output)是指计算机系统与外部设备之间的数据输入和输出操作。外部设备可以是磁盘、网络、键盘、鼠标、显示器等。

        处理 I/O 操作是因为计算机系统需要与外部设备进行数据交换。在实际应用中,很多任务都涉及到与外部设备的数据输入和输出。例如:

  1. 读取文件:当需要从文件中读取数据时,必须进行文件的输入操作。
  2. 写入文件:当需要将数据写入文件时,必须进行文件的输出操作。
  3. 网络通信:当需要与其他计算机进行数据传输时,必须进行网络的输入和输出操作。
  4. 用户交互:当需要与用户进行交互,接收用户输入或向用户展示信息时,必须进行键盘(输入)和显示器(输出)的操作。
  5. 数据库访问:当需要从数据库中读取或写入数据时,必须进行数据库的输入和输出操作。

        处理 I/O 操作的目的是为了实现数据的输入和输出,并与外部环境进行信息交流。这些操作是计算机系统与外部世界进行交互的重要手段。例如,通过读取文件,我们可以获取文件中存储的数据;通过网络通信,可以实现计算机之间的数据交换;通过用户交互,可以接收用户的指令并作出相应的响应;通过数据库访问,可以进行持久化数据的读取和存储等。

什么是流?


        流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。


Java流的分类

(1)按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。

(2)按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流

(3)按功能分:
节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。

Java中的NIO,BIO,AIO分别是什么

  1.         BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。是传统的阻塞式I/O模型。在该模型中,当一个I/O操作(如读写数据)发生时,调用线程将会被阻塞,直到数据传输完成。这意味着在执行I/O操作期间,线程将一直处于等待状态,无法进行其他任务,效率较低。
  2.         NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

NIO引入了Channel和Buffer的概念。Channel表示与实体(如文件、套接字通道、管道等)之间的连接,而Buffer用于在内存中存储数据。NIO通过Selector实现了多路复用,使得一个线程可以管理多个Channel,并且可以进行非阻塞的读写操作。以下是NIO的主要组件:

  • Channel(通道):负责读取或写入数据。不同类型的Channel对应不同类型的I/O源,例如文件、套接字等。

  • Buffer(缓冲区):在内存中存储数据。Buffer提供了对数据进行读写操作的方法,可以从Channel中读取数据到Buffer,或将Buffer中的数据写入到Channel。

  • Selector(选择器):用于实现多路复用。Selector可以注册多个Channel,并通过轮询的方式检测这些Channel上是否有I/O事件发生,从而实现单线程处理多个连接。

        NIO模型的优势在于能够使用单个线程处理多个连接,减少了线程切换的开销。它适用于需要处理大量连接的场景,如服务器应用程序。

        3.       AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

        AIO引入了基于事件和回调的异步操作机制。在AIO模型中,当一个I/O操作启动后,调用线程可以继续执行其他任务,而无需等待操作完成。当操作完成后,系统会通知应用程序完成操作的回调函数。以下是AIO的主要组件:

  • AsynchronousChannel(异步通道):类似于NIO的Channel,负责发起异步I/O操作。

  • CompletionHandler(完成处理器):定义了异步操作完成后的回调方法。当异步操作完成时,将调用注册的CompletionHandler来处理完成的结果。

        AIO模型的优势在于能够实现真正的异步I/O操作,避免了线程等待的情况,提高了系统的并发处理能力。AIO适用于需要高性能和高并发的场景,如高负载的网络服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值