JAVA NIO操作类型

简介:

JAVA NIO共定义了四种操作类型:OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT,分别对应读、写、请求连接、接受连接等网络Socket操作。ServerSocketChannel和SocketChannel可以注册自己感兴趣的操作类型,当对应操作类型的就绪条件满足时OS会通知channel,下表描述各种Channel允许注册的操作类型,Y表示允许注册,N表示不允许注册,其中服务器SocketChannel指由服务器ServerSocketChannel.accept()返回的对象。



OP_READ OP_WRITE OP_CONNECT OP_ACCEPT
服务器ServerSocketChannel N N N Y
服务器SocketChannel Y Y N N
客户端SocketChannel Y Y Y N


客户端请求连接,服务器端接受连接,客户端与服务器端开始相互发送消息(读写),按这个逻辑上表就容易理解。为了更深入理解,我们可以看看每个操作类型的就绪条件。


操作类型 就绪条件及说明
OP_READ 当操作系统读缓冲区有数据可读时就绪。并非时刻都有数据可读,所以一般需要注册该操作,仅当有就绪时才发起读操作,有的放矢,避免浪费CPU。
OP_WRITE 当操作系统写缓冲区有空闲空间时就绪。一般情况下写缓冲区都有空闲空间,小块数据直接写入即可,没必要注册该操作类型,否则该条件不断就绪浪费CPU;但如果是写密集型的任务,比如文件下载等,缓冲区很可能满,注册该操作类型就很有必要,同时注意写完后取消注册。
OP_CONNECT 当SocketChannel.connect()请求连接成功后就绪。该操作只给客户端使用。
OP_ACCEPT 当接收到一个客户端连接请求时就绪。该操作只给服务器使用。


java.nio.channels.SelectionKey类定义了这四种操作类型并提供就绪判断方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  final  boolean  isReadable() {
         return  (readyOps() & OP_READ) !=  0 ;
     }
     
public  final  boolean  isWritable() {
         return  (readyOps() & OP_WRITE) !=  0 ;
     }    
     
public  final  boolean  isConnectable() {
         return  (readyOps() & OP_CONNECT) !=  0 ;
     }  
     
public  final  boolean  isAcceptable() {
         return  (readyOps() & OP_ACCEPT) !=  0 ;
     }


     本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1581934 ,如需转载请自行联系原作者


相关文章
|
12天前
|
存储 安全 Java
Java一分钟之-泛型擦除与类型安全
【5月更文挑战第20天】Java泛型采用类型擦除机制,在编译期间移除泛型信息,但在编译阶段提供类型安全检查。尽管需要类型转换且可能产生警告,但可以通过特定语法避免。使用泛型时应注意自动装箱拆箱影响性能,无界通配符仅允许读取。理解这些特性有助于编写更安全的代码。
39 4
|
1天前
|
存储 监控 Java
深入探索Java语言的NIO(New I/O)技术
深入探索Java语言的NIO(New I/O)技术
|
1天前
|
SQL Java 数据库连接
Java JDBC连接与操作深度解析
Java JDBC连接与操作深度解析
5 1
|
2天前
|
存储 监控 Java
Java nio非阻塞io
Java nio非阻塞io
|
2天前
|
存储 Java
Java二维数组的声明与操作技术详解
Java二维数组的声明与操作技术详解
20 10
|
2天前
|
存储 Java 索引
Java二维数组的引用与操作技术详解
Java二维数组的引用与操作技术详解
|
3天前
|
存储 Java 索引
Java一维数组元素的引用与操作技术详解
Java一维数组元素的引用与操作技术详解
11 1
|
5天前
|
Java
Java初识泛型 | 如何通过泛型类/泛型方法获取任意类型的三个数的最大值?
本文介绍了如何使用Java中的泛型来实现一个可以比较任意数值类型最大值的功能。。
20 2
|
8天前
|
SQL Java 关系型数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
JavaWeb(JDBC编程)看这一篇就够了 —— 如何使用Java操作mysql数据库
8 0
|
8天前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
7 0