1、区别

IO
①IO面向流,面向流意味着每次从流中读取一个或多个字节,直到读取所有字节,他们没有被缓存在任何地方
②IO流是阻塞的。当一个线程调用read()或write()时该线程被阻塞,这道有一些数据被读取或者数据完全写入,该线程在此期间不能做任何事情

③IO基于字节流和字符流进行操作


NIO
①NIO面向缓冲区
②NIO非阻塞,非阻塞读:一个线程从某通道发送请求读取数据,如果目前没有数据可用,什么不会获取没并且该线程不是保持阻塞状态该县城可以继续做其他事情
非阻塞写也是同一个道理:一个线程请求写入一些数据到某通道,但不需要等待他完全写入,这个线程可以同时可以去做其他事情
线程通常将非阻塞io的空闲时间用于其他通道上执行io操作,所以一个单独的线程可以管理多个输入和输出通道(channel)

③NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中

2、NIO核心

NIO核心:channel(通道)、Buffer(缓冲区)、selector

   channel:和IO中stream(流)差不多一个等级,只不过stream是单向(比如inputstream、outputstream),而channel是双向,既可以读又可以写

      NIO中channel实现有:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel

   Buffer:NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short

  Selector:Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便,

      例如在一个聊天服务器中。要使用Selector, 得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等

 

posted on 2019-08-20 16:05  colorfulworld  阅读(133)  评论(0编辑  收藏  举报