Fork me on GitHub

Java NIO

注意:所有文章除特别说明外,转载请注明出处.

Java NIO

[TOC]

概念

在实现NIO的客户端时,首先调用静态工厂方法 SocketChannel.open() 创建新的 java.nio.channels.SocketChannel对象。方法参数是 java.net.SocketAddress 对象,指示要连接的主机和端口。

缓冲区

1. 位置(postion)

2. 容量(capacity)

3. 限量(limit)

4. 标记(mark)

创建缓冲区

1. 分配

allocate()方法只返回一个有指定固定容量的新缓冲区,是一个kg能偶缓冲区。

2. 直接分配

ByteBuffer类有另外一个allocateDirect()方法,该方法不为缓冲区创建后备数组。VM会对以太网卡、核心内存或其它位置的缓冲区使用直接内存访问,以此实现直接分配的ByteBuffer。

3. 包装

如果已经有要输出的数据数组,一般要用缓冲区进行包装,而不是分配一个新的缓冲区,然后一次一部分的复制到这个缓冲区。

byte[] data = "hello world".getBytes("utf-8");
ByteBuffer buffer1 = ByteBuffer.wrap(data);

char[] text = "some text".toCharArray();
CharBuffer buffer2 = ByteBuffer.wrap(text);

SocketChannel

SocketChannel类可以读写TCP Socket。数据必须编码到ByteBuffer对象中完成读/写。每个SocketChannel都与一个Socket对象相关联,该Socket对象可用于高级配置,不过一般默认选项便可正常运行。

//该方法创立连接将阻塞,即在连接建立或抛出异常之间,该方法不会返回
1. public static SocketChannel open(SocketAddress address) throws IOException;

//该方法创建初始未连接方法,以后需要connect()方法进行连接
2. public static SocketChannel open() throws IOException;

1. 读取

在读取SokcetChannel内容时需要创建一个ByteBuffer,通道可以在ByteBuffer中存储数据,然后将该buffer传给read()方法。

提示:1. 散布(scatter),表示能从一个源填充多个缓冲区。

2. 写入

Socket通道提供读写方法,一般情况下它们是全双工的。在想写入数据时,只需要填充一个ByteBuffer,然后将其回绕传给某个写入方法,该方法将数据复制到,输出时将缓冲区排空。

提示:2. 聚集(gather),表示将多个缓冲区的数据写入到一个Socket中。

3. 关闭

在用完通道之后需要关闭,释放它可能使用的端口和其它资源。close()方法。

ServerSocketChannel

该类只有一个目的就是接受入站连接,我们无法读取、写入或连接ServerSocketChannel。其支持的唯一操作便是接受一个新的入站连接。accept() | close() 方法。

//该方法只是创建这个对象
1. ServerSocketChannel server = ServerSocketChannel.open();

//该方法创建ServerSocket
2. ServerSocket socket = server.socket();

//Java 7中ServerSocketChannel有自己的bind()方法

1. 接受连接

accept()方法监听入站连接请求。该方法可以在阻塞和非阻塞模式下操作。

Selector类

1. 调用静态工厂方法 Selector.open() 来创建新的选择器。

2. 向选择器增加通道,Selector类没有增加通道的方法。register()方法在SelectableChannel类中声明。

    //参数1表示通道要向哪个选择器注册
    //参数2是SelectionKey类中的命名常量,标识通道所注册的操作
    public final SelectionKey register(Selector sel, int ops);

3. 当知道有通道已经准备好处理时,可以使用selectedkey()方法获取就绪通道。

    public abstract Set<SelectionKey> selectedKeys();

SelectionKey 类

SelectionKey类相当于通道的指针,一般会存储该通道的连接状态。

本文标题:Java NIO

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:09:01

原始链接:http://bangjinhu.github.io/undefined/Java NIO/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.