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()获取所选密钥集合。

 

posted @ 2022-03-11 18:21  人生的激活码  阅读(130)  评论(0编辑  收藏  举报