Java提供了哪些IO方式?NIO如何实现复用?

一、Java提供了哪些IO方式?

Java IO方式由很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分。

首先,传统的Java.IO包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式。也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用时可靠的线性顺序。
Java.io包的好处是代码比较简单、直观,缺点是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。很多时候,人们也把Java.net下面提供的部分API,比如Socket、ServerSocket、HttpURLConnection也归类到同步阻塞IO类库,因为网络通信同样也是IO行为。
第二,在Java 1.4中引入了NIO框架(Java.nio包),通过了Channel、Selector、Buffer等新的抽象,可以构建多路复用、同步非阻塞IO程序,同时提供了更接近操作系统底层的高性能数据操作方式。
第三、在Java 7中,NIO有了进一步的改进,也就是NIO 2,引入了异步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。异步IO操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

基本概念:

 同步和异步(synchronous/asynchronous)。简单来说,同步是一种可靠的有序运行机制、当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系
阻塞与非阻塞(blocking/non-blocking)。在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续。比如ServerSocket新连接建立完毕,或数据读取,写入操作完成;而非阻塞则是不管IO操作是否结束,直接返回,相应操作在后台继续处理。
IO多路复用。IO指的就是我们网络IO,多路指多个TCP连接(或多个Channel),复用指复用一个或少量线程。串起来就是很多个网络IO复用一个或少量的线程来处理这些连接。

二、IO和NIO的区别

IO NIO
面向流 面向缓冲区
阻塞IO 非阻塞IO
一个线程处理一个连接 单线程管理多个连接

1.面向流与面向缓冲
2.阻塞与非阻塞
3.单个连接与多个连接
1>Java NIO:单线程管理多个连接
NIO可以使用一个或几个线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器是一个优势。同时,如果你需要维持许多打开的连接到其他计算机上。如P2P网络中,使用一个单独的线程来管理你的所有出站连接。
Java提供了哪些IO方式?NIO如何实现复用?_第1张图片
2>Java IO:一个连接通过一个线程处理
如果有少量的连接使用非常高的带宽,一次发送大量的数据,典型的IO服务器实现更加契合。
Java提供了哪些IO方式?NIO如何实现复用?_第2张图片

三、NIO如何实现多路复用?

NIO核心组件:Channel,Buffer,Selector
1.Buffer:
Java NIO BUffer用于和NIO Channel交互。我们从Channel中读取数据到buffer里,从buffer把数据写入到channel;
buffer本质上就是一块内存区
2.Channel
通常来说NIO中的所有IO都是从Channel(通道)开始的
3.Selector
Selector一般称为选择器,也称为多路复用器。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel的状态是否处于可读、可写。因此可以实现单线程管理多个Channel
Java提供了哪些IO方式?NIO如何实现复用?_第3张图片
Java提供了哪些IO方式?NIO如何实现复用?_第4张图片

更多内容可见Java NIO详解

你可能感兴趣的:(Java)