IO跟NIO的区别

IO跟NIO的区别

1. 面向流跟面向缓存

1.1 面向流意味着每次只能从流中一个或多个字节的读取,直至读完,没有被缓存到任何地方缓存

1.2 Java NIO提供了channel,Channel和传统的io中的stream很类似,但也有很大区别,主要区别 就是通道是双向的,经过channel能读也能写,它将数据读取到一个稍后处理的缓冲区,须要的时候可在缓冲区先后移动,这就增长了处理过程当中的灵活性。可是还须要检查该缓冲区是否有所须要的数据,并且确保新添加的数据不会覆盖缓冲区还没有处理的数据。网络

2. 阻塞与非阻塞

2.1 io的各类流是阻塞的,就是当一个线程调用读写方法时,该线程会被阻塞,直到读写完,在这期间该线程不能干其余事,CPU转而去处理其余线程,假如一个线程监听一个端口,一天只会有几回请求进来,可是CPU却不得不为该线程不断的作上下文切换,而且大部分切换以阻塞了结。多线程

2.2 NIO通信是将整个任务切换成许多小任务,由一个线程负责处理全部io事件,并负责分发。它是利用事件驱动机制,而不是监听机制,事件到的时候再触发。NIO线程之间经过wait,notify等方式通信。保证了每次上下文切换都有意义,减小无谓的进程切换。函数

3. IO选择器(selector)

Selector类是NIO的核心类,经过Selector类来检测多个通道是否有事件发生,若是有就获取事件并对事件进行响应处理。这样就能够经过一个单线程来管理多个通道,这样只有在通道真正有读写事件发生的时候,才会调用函数进行读写,避免多线程之间的上下文切换致使的开销。线程

4. 通道channel

在前面已经提到,Channel和传统IO中的Stream很类似。虽然很类似,可是有很大的区别,主要区别为:通道是双向的,经过一个Channel既能够进行读,也能够进行写;而Stream只能进行单向操做,经过一个Stream只能进行读或者写;
如下是经常使用的几种通道:
FileChannel
SocketChanel
ServerSocketChannel
DatagramChannel
  经过使用FileChannel能够从文件读或者向文件写入数据;经过SocketChannel,以TCP来向网络
链接的两端读写数据;经过ServerSocketChanel可以监听客户端发起的TCP链接,并为每一个TCP链接建立一个新的SocketChannel来进行数据读写;经过DatagramChannel,以UDP协议来向网络链接的两端读写数据。进程

相关文章
相关标签/搜索