Java NIO 基础教程

Java NIO,是Java SE 1.4版以后,针对网络传输效能优化的新功能。在Java 7时再推出NIO 2,针对档案存取的效能优化。

Java NIO的核心内容为:

  • Channel
  • Buffer
  • Selector

Channel

Channel还真是不怎么好说,个人认为Channel作为沟通数据和实体(文件等)的通道,Buffer中的数据可以通过Channel传输到实体,也可以反过来。从实体读取数据到Buffer后,我们便可以对数据进操作。

Channel还有几个主要的接口,比如ReadableByteChannelWritableByteChannel,分别控制Channel的可读和可写。

比如ByteChannel接口

/**
 * A channel that can read and write bytes.  This interface simply unifies
 * {@link ReadableByteChannel} and {@link WritableByteChannel}; it does not
 * specify any new operations.
 *
 * @author Mark Reinhold
 * @author JSR-51 Expert Group
 * @since 1.4
 */

public interface ByteChannel
    extends ReadableByteChannel, WritableByteChannel
{

}

它集成了ReadableByteChannel, WritableByteChannel, 拥有了 isOpen()、close()、read(ByteBuffer dst)、write(ByteBuffer src)四个方法。

在Channel中,比较常用的是

  • FileChannel
  • SocketChannel
  • ServerSocketChannel
  • DatagramChannel

管道之间的传输

  • transferFrom()
toChannel.transferFrom(position, count, fromChannel);

将formChannel写入到toChannel。

  • transferTo()
fromChannel.transferTo(position, count, toChannel);

将fromChannel写入到toChannel。

Buffer

用于特定基元类型的数据的容器。缓冲区是特定基元类型的线性有限元素序列。除了它的内容之外,缓冲区的基本属性是它的容量capacity,限制limit和位置position
缓冲区的容量是它包含的元素数量。缓冲区的容量永远不会消极,永远不会改变。
缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会超过其容量。
缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不会为负,并且永远不会超过其限制。

Buffer和Channel结合使用,Channel将数据写入Buffer,或者返回来,而我们则对Buffer进行操作。

Buffer主要方法.

  • clear 使缓冲区为通道读取或相对放置操作的新序列做好准备:它将容量限制和位置设置为零。
  • flip 使缓冲区为通道写入或相对获取操作的新序列做好准备:它将限制设置为当前位置,然后将位置设置为零。
  • rewind 使缓冲区准备好重新读取它已包含的数据:它保持限制不变并将位置设置为零。

Selector

Selector可以使用单线程来来处理多个Channel。

//创建selector
Selector selector = Selector.open();
//设置channel为非阻塞模式  与selector一起使用必须为非阻塞模式
channel.configureBlocking(false);
//注册 第二个参数为channel模式,这里为只读模式
SelectionKey key = channel.register(selector,Selectionkey.OP_READ);

调用select()方法后,如果返回,说明有Channel就绪,可以用Set<SelectionKey> selectionKeys = selector.selectedKeys();获取就绪的事件进行处理。

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

人生中没有四季 唯有那寒冬的荒野