NIO和IO

NIO与普通IO的主要区别

IO NIO
面向流(Stream Oriented) 面向缓冲区(Buffer Oriented)
阻塞IO(Blocking IO) 非阻塞IO(Non Blocking IO)
(无) 选择器(Selectors)
  1. Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
  2. Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
  3. Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

缓冲区(Buffer)

Buffer 是一个对象, 它包含一些要写入或者要读出的数据。在NIO 类库中加入Buffer 对象, 体现了新库与原I/O 的一个重要区别。在面向流的I/O 中, 可以将数据直接写入或者将数据直接读到对象中。

在NIO 厍中, 所有数据都是用缓冲区处理的。在读取数据时, 它是直接读到缓冲区中的: 在写入数据时, 写入到缓冲区中。任何时候访问NIO 中的数据, 都是通过缓冲区进行操作。

缓冲区实质上是一个数组。通常它是一个字节数组(ByteBuffer) , 也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组, 缓冲区提供了对数据的结构化访问以及维护读写位置(limit) 等信息。

最常用的缓冲区是ByteBuffer, 一个ByteBuffer 提供了一组功能用于操作byte 数组。除了ByteBuffer, 还有其他的一些缓冲区, 事实上, 每一种Java 基本类型( 除了Boolean类型) 都对应有一种缓冲区。

你可能感兴趣的:(NIO和IO)