刚刚开始接触nio的时候有点迷惑,在网上也看过很多资料,大多都是讲了怎么用,没有个系统介绍。于是就花了点时间看看。
1、nio是java传统网络IO的升级版,nio和io的关系可以看成http协议和tcp/ip协议(升级版)
2、nio相比于io,是更精准的传输协议。具体的下面再说。
然后说说nio和io的比较
io传输直接是读取byte数组,由此产生的阻塞,缓冲区的额外开销等等问题在nio上没有的,原因如下:
首先看看nio的传输单元:java.nio包下的ByteBuffer,ShortBuffer,FloatBuffer,IntBuffer,DoubleBuffer,LongBuffer,它们都继承于Buffer,
Buffer含有4个属性,
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
由此可见,在传输的时候,就标注好了每个传输单元的长度/容量等一系列信息,自然在接受一端无需缓冲区了,很类似http的格式,增加了报文头等),解决网络io长久以来的缓冲区的各种问题。
网络传输阻塞问题在nio的解决。
原有io在socket传输时一旦信息传送停止,等待接收的线程就会一直等待直到超时异常抛出。
nio中采用的是基于事件驱动的事件-触发的模式来避免了阻塞,或者说是反应器设计模式(可能有的人也觉得是观察者模式,的确很类似:当被被观察体改变时,所有相关的依属体都得到通知,不过观察者只限于单个事件,反应器是与多公个事件源关联)。
nio的非阻塞机制由Channel 类和Selector 类来完成,Selector是Channel的多路复用器,Channel官方解释为服务端和客户端的一种通信机制,每个 Channel 向 Selector 注册事件。当事件从客户机处到来时, Selector 将它们多路分用并将这些事件分派到相应的 Channel 。乍一看上去就是不是很熟悉?没错,很类似Socket = SocketServer.accpet(),然后分配一个新线程给对应的Socket,但是这里的Channel仅仅是作为信息传输,不能加入额外的逻辑处理。
相比于传统的网络IO,不需要用户自定义Thread来负责和客户端交互信息,只需要处理业务逻辑。
以网络传输来说,运行步骤如下
1、Channel向Selector注册
2、有请求则Selector分配Channel进行信息传输(按照Buffer的“协议”),如果某个线程在一个Channel的I/O上阻塞时,另一个线程可以关闭这个Channel(实际物理传输层的上阻塞是不可避免的)。
3、当某个Channel信息接受完整后,接受到的信息提交给用户自定义的处理模块完成业务处理,返回信息由这个Channel写回去
最后说说我认为的nio的缺点(缺点仔细想想也谈不上,主要是需要注意地方),由于加入Buffer格式,对于旧有的系统和非java.nio的系统来说,得有额外的支持。
分享到:
相关推荐
根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。...通过本书的学习,开发者可以全面掌握 Java NIO 的各种特性和技巧,从而写出更加高效可靠的 Java 代码。
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从JDK 1.4版本开始引入的一种新的IO模型,它为Java应用程序提供了更高效的数据传输方式,尤其适用于高并发、大数据量的网络服务。与传统的IO...
在《JAVA NIO学习网站》的博文中,作者可能详细讲解了如何使用这些组件以及它们之间的交互。例如,可能会介绍如何创建并配置通道,如何使用缓冲区读写数据,如何注册通道到选择器,以及如何利用选择器处理多个并发...
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。...学习和理解Java NIO以及Netty的使用,对于提升Java网络编程的能力至关重要。
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java在JDK 1.4版本引入的一种新的I/O模型,它为Java开发者提供了更高效、...学习和掌握Java NIO,能够帮助开发者编写出更高效、更易维护的网络程序。
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统I/O模型的新技术。在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作...
### JAVA_NIO学习总结 #### 重要知识点概览 JAVA_NIO(Non-blocking I/O,非阻塞I/O)是Java平台中用于替代传统IO(Blocking IO)的一种高性能IO处理模型,首次出现在JDK 1.4中。NIO通过引入通道(Channel)和缓冲区...
通过这个实例,开发者可以学习如何设置NIO服务器,如何处理多个并发连接,并了解NIO如何提高服务器的吞吐量和响应性。NIO适用于需要处理大量并发连接的场景,例如聊天服务器、游戏服务器等。理解并掌握Java NIO的...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于高效处理I/O操作的重要框架。...通过学习这两部分的内容,开发者可以更好地理解和利用Java平台提供的I/O能力,优化应用程序的性能。
通过对《Pro Java 7 NIO2》中Path类的学习,我们可以看到NIO.2 API为Java开发者提供了强大而灵活的文件系统操作工具。从简单的路径构建到复杂的文件属性访问,Path类及其相关API为Java程序提供了处理文件和目录的...
Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新特性,是对传统的I/O模型的一种改进。...通过阅读"java-nio.pdf"这份文档,你将能够深入学习Java NIO技术及其在异步连接池中的应用。
开发者可以通过学习和掌握Java.nio,优化自己的应用程序,特别是网络通信和文件操作相关的部分。而压缩包中的"thread"、"noblock"、"block"可能分别对应于线程管理、非阻塞I/O和阻塞I/O的相关示例或讨论,进一步深入...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输...学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新...学习和掌握NIO,对于提升Java应用的性能和扩展性至关重要。