NIO操作过程
- 非阻塞读/写操作
- 读-- 从通道读取数据到buffer,同时可以继续做别的事情,但数据都到buffer之后,线程再继续处理数据
- 写-- 一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程可以同时去做别的事情
- Buffer(缓冲区)
- IO 面向流(Stream oriented),而NIO 面向缓冲区(Buffer oriented)
- Buffer是一个对象,包含一些要写入或者要读出的数据。在NIO类库中假如Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中,可以将数据直接写入或者将数据直接读到Stram对象中。虽然 Stream 中也有 Buffer 开头的扩展类,但只是流的包装类,还是从流读到缓冲区,而 NIO 却是直接读到 Buffer 中进行操作。
- 最常用的缓冲区是ByteBuffer,一个ByteBuffer提供了一组功能用于操作byte数组。除了ByteBuffer,还有其他的一些缓冲区,事实上,每一种Java基本类型(除了Boolean类型)都对应有一种缓冲区。
- IO 面向流(Stream oriented),而NIO 面向缓冲区(Buffer oriented)
- Channal(通道)
- NIO 通过Channel(通道) 进行读写
- 通道是双向的,可读也可写,而流的读写是单向的
- 通道只能和Buffer交互,因为Buffer,可以异步地读写
- Selector (选择器)
- NIO有选择器,而IO没有
- 选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。因为线程之间的切换对于操作系统来说是很昂贵的,因此提高了效率选择器是有用的。
- NIO有选择器,而IO没有