Java NIO和IO的主要区别
下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。
IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器
- 面向流与面向缓冲
IO是面向流的,使用者从流中将数据读取出来,缓存在其它地方后才能使用;而NIO面向缓冲区,数据的读写通过缓冲区来进行,可以在缓冲区中前后移动,增加了处理过程中的灵活性,当然也会导致更复杂的检查。 - 阻塞与非阻塞IO
IO是阻塞的,一个线程中调用read()或者write()时不能做其他的事情;而NIO的非阻塞模式可以将空余时间用来做其他事情,一个线程中可以管理多个输入输出通道。 - 选择器
NIO选择器允许在一个线程中件数多个输入通道,使得多输入情况下的处理非常简单。
由于非阻塞和选择器的使用,NIO在处理大量连接时更加高效和便利,但是由于缓冲数据读写的不确定性,对单份数据的解析则较为麻烦;因此如果需要管理同时打开的大量连接,这些连接每次发送的数据不多(聊天服务器,P2P网络等),使用NIO更有优势;而连接较少却发送较多数据或者数据需要逐步解析时,使用IO则更为方便。