java中nio知识梳理及实例
最近,我学习了NITY的相关知识,涉及到NiO的相关知识,所以我梳理了NiO的基础。
1. 核心组件
读写是JavaNIO中最基本的操作。您可以创建缓冲区,从通道读取数据,同时将数据写入通道。
- 渠道
- 缓冲区
- 选择器
在NiO中,我们使用通道和缓冲区。NiO中的所有I/O都从一个通道开始。数据总是从缓冲区写入通道,然后从通道读取到缓冲区
2. 频道
Java nio中的通道。在通道包中,让我们看一下继承关系:
2.1袜子通道
Socketchannel用于TCP网络通信,以链接通道。创建socketchannel有两种方法:
- 当连接到达serversocketchannel时
- 打开socketchannel并连接到服务
让我们用选择器查看SoChanChanp客户端-服务器通信框架图:
2.2 SocketChannel的操作
打开SocketChannel:
SocketChannel sc = SocketChannel.open(); sc.connect(new InetSocketAddress("http://localhost", 8080)); ByteBuffer bb = ByteBuffer.allocate(84); int bytesRead = sc.read(bb); String newData = "The new String is writing in a file ..." + System.currentTimeMillis(); ByteBuffer bb= ByteBuffer.allocate(48); bb.clear(); bb.put(newData.getBytes()); bb.flip(); while(bb.hasRemaining()) { sc.write(bb); } sc.close();
3. Buffers
下面看一下Buffer的继承关系
选择器用于使用单个线程处理多个通道。因此,它需要更少的线程来处理通道。对于操作系统来说,在线程之间切换非常昂贵。因此,为了提高系统的效率
一个选择器处理多个通道。
当向选择器注册一个或多个通道时,我们可以调用select()方法之一。此方法返回一个通道,该通道已为我们要执行的事件做好准备,例如连接、读取、写入和接受。选择的方法有:
Int select():select()方法返回的整数值告诉我们有多少通道可以进行通信。
Int-select(长TS):与select()相同,只是它在最大TS(毫秒)时间段内阻塞
Int selectnow():非阻塞,返回任何准备好的通道
调用任何select()方法后,将返回一个值。然后通过调用selector的selectedkeys()获取所选密钥集合。