API笔记之java.nio.channels.SelectionKey
import java.nio.channels.SelectableChannel; import java.nio.channels.Selector; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; /** * A token representing the registration of a {@link SelectableChannel} with a * {@link Selector}. * * A token representing the registration of a SelectableChannel with a Selector. * 一个SelectoableChannel在Selector中注册之后就产生一个SelectionKey对象,表示我们对这个SelectoableChannel的什么事件感兴趣,当然 * SelectionKey的interestOps是我们自己传进去的, 我们调用selector的selectedKey方法会返回被选中的SelectionKey集,通过这个key判断 * 什么事件,然后通过channel()方法进行io操作 */ public abstract class SelectionKey { /** * 四种事件用一个int(intrestOps)变量表示(其实byte也够了?) * bits: [0|1] [0|1] [0|1] [0|1] * means: accept connect write read * 想要哪几种事件,就对这些事件的值进行或运算,得出的就是intrestOps *比如 interestOps = 2(0010),该key会被选中, 事件是write, 主线逻辑拿得到这个key对应的channel可以进行写操作 */ /** * 当selector发现: * 1.channel有数据可读 * 2.channel has been remotely shut down for further reading(不能100%确定其意思,猜测是channel的读通道关闭) * 3.channel has an error pending,有错误待处理? * 时, selector就会把该key加到selected key set中 */ public static final int OP_READ = 1 << 0; /** *这三个和上面差不多 */ public static final int OP_WRITE = 1 << 2; public static final int OP_CONNECT = 1 << 3; // 这个只有SocketChannel才有 public static final int OP_ACCEPT = 1 << 4; // 这个只有ServerSocketChannel才有 /** * 不给外部new实例, 在SelectionKeyImpl中会开放这个构造方法给包内的lei使用 */ protected SelectionKey() { } /** * Returns the channel for which this key was created. This method will * continue to return the channel even after the key is cancelled. */ public abstract SelectableChannel channel(); /** * Returns the selector for which this key was created. This method will * continue to return the selector even after the key is cancelled. */ public abstract Selector selector(); /** * Tells whether or not this key is valid. * * 当key被创建开始就是valid的,直到以下情况发生: * 1.cancel()方法被调用 * 2.它对应的channel的被close * 3.它对应的selector被close */ public abstract boolean isValid(); /** * Requests that the registration of this key's channel with its selector * be cancelled. * 被调用后,该key就是invalid的了,会被加到对应的selector的cancelled key set中,当selector的下一次选择操作时, * 该key就会被移除(selector的三种key set) */ public abstract void cancel(); /** * Retrieves this key's interest set. */ public abstract int interestOps(); /** * Sets this key's interest set to the given value. */ public abstract SelectionKey interestOps(int ops); /** * Retrieves this key's ready-operation set. */ public abstract int readyOps(); /** * Tests whether this key's channel is ready for reading. */ public final boolean isReadable() { return (readyOps() & OP_READ) != 0; } /** * Tests whether this key's channel is ready for writing. */ public final boolean isWritable() { return (readyOps() & OP_WRITE) != 0; } /** * Tests whether this key's channel has either finished, or failed to * finish, its socket-connection operation. */ public final boolean isConnectable() { return (readyOps() & OP_CONNECT) != 0; } /** * Tests whether this key's channel is ready to accept a new socket * connection. */ public final boolean isAcceptable() { return (readyOps() & OP_ACCEPT) != 0; } /** * 绑定的对象 */ private volatile Object attachment = null; //原子性更新引用类型的变量 private static final AtomicReferenceFieldUpdater<SelectionKey,Object> attachmentUpdater = AtomicReferenceFieldUpdater.newUpdater( SelectionKey.class, Object.class, "attachment" ); /** * Attaches the given object to this key. */ public final Object attach(Object ob) { return attachmentUpdater.getAndSet(this, ob); } /** * Retrieves the current attachment. */ public final Object attachment() { return attachment; } }
相关推荐
- **Channels 工具类**:介绍了 Java NIO 提供的一些工具类,用于简化 Channel 的使用。 #### 3. Selector(选择器) - **Selector 基础**:介绍了 Selector 的基本概念及工作原理。 - **使用 SelectionKey**:...
4. **API设计**:Java.nio的API设计更加面向对象,提供了更丰富的功能集和更灵活的控制机制。 总之,Java.nio与Java.io各有优势,在不同的场景下应选择最适合的技术。对于需要高性能、高并发的应用,Java.nio是更好...
Java.nio,全称为Java Non-blocking Input/Output,是Java平台从1.4版本开始引入的一套全新的I/O API,旨在替代传统的Java.io流API。它提供了更高效、更灵活的I/O操作方式,特别是在处理大量并发连接时,性能显著...
Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...
`java.nio.file`库的引入使得Java在文件操作方面有了质的飞跃,它简化了API,提高了性能,并提供了更多现代文件系统所需的功能。无论是处理小文件还是大文件,无论是单线程还是多线程环境,`java.nio.file`都能提供...
找了好久,终于找到了,java刷新同步获取网络资源
5. `java.nio.channels.spi`:类似的,这个包提供了Channel和Selector的SPI,用于扩展NIO API。 ByteBuffer是NIO中的关键类,它与其他类型的Buffer(如CharBuffer、IntBuffer等)一样,具有capacity、limit和...
JDK1.7 之 java.nio.file.Files 读取文件仅需一行代码实现 java.nio.file.Files 类是 JDK1.7 中引入的新的文件操作类,该类包含了许多有用的方法来操作文件。其中,Files.readAllBytes(Path) 方法可以将整个文件...
标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...
java.io clojure.java.io 的 JK7 java.nio.file.Path 兼容性依赖信息该库托管在 Releases 上。 依赖: [me.moocar/java.io " 0.1.0 " ]用法是 JDK7 中引入的文件路径的抽象。 这个库提供了和 Paths 之间的兼容性。 ...
Java NIO 的设计目的是为了克服传统Java IO API在面对大量并发连接时存在的性能瓶颈。 ##### 使用背景 传统的Java IO模型基于流(Stream),每次读写操作都是阻塞式的,即在读写操作完成之前,当前线程会被挂起等待...
Java NIO,全称为New Input/Output,是Java在1.4版本引入的一个新的I/O API,用于替代标准的Java IO API。这个新的API提供了一种不同于传统阻塞I/O模型的非阻塞I/O处理方式,使得在处理高并发、大数据传输场景时性能...
《Apress.Pro.Java.7.NIO.2.2011》这本书专注于讲解Java 7中的非阻塞I/O(Non-blocking I/O, NIO)和NIO 2的高级特性,是Java开发者深入理解这一关键领域的重要参考资料。NIO在Java平台中扮演着至关重要的角色,特别...
o Clojure对java.nio的支持。 将clojure.java.io的输入流,输出流和复制功能扩展到java.nio类。 定义新的强制功能缓冲区,字节缓冲区,字符缓冲区,双缓冲区,浮点缓冲区,整数缓冲区,长缓冲区,短缓冲区,通道,可...
在JDK API中,`java.util`包是核心的类库之一,包含了大量用于处理集合、日期时间、泛型和并发等任务的类。例如,`ArrayList`和`HashMap`是两种常用的容器,分别用于存储有序和键值对的数据。`Collections`类提供了...
java.NIO与Files工具类(解决方案).md