IO与NIO(非阻塞IO)之间的区别:
IO | NIO |
面向流 | 面向缓存 |
阻塞 | 非阻塞 |
- | 选择器 |
1. 流与缓存
Java IO是面向流的,意味着每次从流中读一或多个字节,直到读取所有的字节,它们是没有缓存在任何地方。此外,它们不能前后移动流中的数据,如果需要移动,需先将它们缓存到一个缓冲区。
Java NIO是面向缓存的,数据读取到一个稍后处理的缓存,需要时可在缓存中前后移动,这就增加了处理过程中的灵活性。但还需要检查是否该缓存包含所有需要的数据,而且,需确保当更多的数据读入缓存时,不要覆盖缓存中尚未处理的数据。
2. 阻塞与非阻塞
Java IO中各种流是阻塞的,这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到数据被读取或完全写入。
Java NIO是线程向某通道发送请求读取数据,仅能得到目前可用的数据,如果没有,就什么都不做,当然它不会保持线程阻塞,所以直至数据可以读取之前,该线程可以做其他事情。
3. 选择器
Java NIO的选择器允许一个单独的线程来监视多个输入通道。