IO vs Nio

1.IO只能实现阻塞式的网络通信。NIO能够实现非阻塞的网络通信.(废话)

2.标准IO基于字节/字符流进行操作;而NIO是基于通道(Channel)进行操作的。(话说,通往女人心灵的通道是xxx道...)

3.流的读写通常是单向的,要么输入,要么输出,不能既是输入流又是输出流。通道是双向的,既可以写数据到通道,又可以从通道中读取数据;

 

4 ) 学习目标 : 虽然现在我们不会直接编写NIO来完成我们的网络层通讯,而是使用成熟的基于NIO的网络框架来实现我们的网络层。如,netty、mina。但对NIO网络编程过程的了解,非常有助于我们更深入的理解netty、mina等网络框架,以至于能更好的使用它们。有人问了,不学这个对我敲代码有何影响,可以说,毛影响都没.

 

5 ) 知道什么是NIO后,我们再来看看java NIO的三个重要组成部分:

Channel(通道),Buffer(缓冲区),Selector(选择器)。

当然,类比学习是比较好的学习方法,这里我仍然跟传统IO做比较,希望他不要打我

 

6 ) Channel ( 通道 ),顾名思义,就是通向什么的道路,为某个提供了渠道。

1.传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。

而Channel是双向的,既可用来进行读操作,又可用来进行写操作。

2.具体的常见实现通道有FileChannel,SocketChanel,ServerSocketChannel,DatagramChannel等

跟具体的实现流FileInputStream,FileOutputStream,FileReader,FileWriter,节点流包装流缓冲流等等功能类似

 

7 ) Buffer(缓冲区),是NIO中非常重要的一个东西,实际上就是一个容器,是一个连续数组。在NIO中所有数据的读和写都离不开Buffer。在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。

 

上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。

简单的讲就是,要想使用Channel(通道)传递数据,必须先把数据丢进Buffer(缓冲区,容器)里.

 

在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:

ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer等

 

8 ) Selector  , 可以说它是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。

以前传统socket编程时,accept方法会一直阻塞,直到有客户端请求的到来,并返回socket进行相应的处理。整个过程是就像上面的例子那样,直到水壶烧开了(响应回去了)才能去处理下一个请求.当然我们也可以用线程池的模式.

NIO则为我们提供了更好的解决方案,Selector选择器能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。并且是按顺序处理,基于通道(Channel)和缓冲区(Buffer)来传输和保存数据。

与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值