SelectableChannel
这个抽象类是所有支持异步IO操作的channel(如DatagramChannel、SocketChannel)的父类。SelectableChannel可以注册到一个或多个Selector上以进行异步IO操作。
SelectableChannel可以是blocking和non-blocking模式(所有channel创建的时候都是blocking模式),只有non-blocking的SelectableChannel才可以参与异步IO操作。
SelectableChannel configureBlocking(boolean block) --- 设置blocking模式。
boolean isBlocking() --- 返回blocking模式。
通过register()方法,SelectableChannel可以注册到Selector上。
int validOps()
返回一个bit mask,表示这个channel上支持的IO操作。当前在SelectionKey中,用静态常量定义了4种IO操作的bit值:OP_ACCEPT,OP_CONNECT,OP_READ和OP_WRITE。
SelectionKey register(Selector sel, int ops)
将当前channel注册到一个Selector上并返回对应的SelectionKey。在这以后,通过调用Selector的select()函数就可以监控这个channel。ops这个参数是一个bit mask,代表了需要监控的IO操作。
SelectionKey register(Selector sel, int ops, Object att)
这个函数和上一个的意义一样,多出来的att参数会作为attachment被存放在返回的SelectionKey中,这在需要存放一些session state的时候非常有用。
boolean isRegistered()
该channel是否已注册在一个或多个Selector上。
SelectableChannel还提供了得到对应SelectionKey的方法:
SelectionKey keyFor(Selector sel)
返回该channe在Selector上的注册关系所对应的SelectionKey。若无注册关系,返回null。
Selector
Selector可以同时监控多个SelectableChannel的IO状况,是异步IO的核心。
Selector open()
Selector的一个静态方法,用于创建实例。
在一个Selector中,有3个SelectionKey的集合:
1. key set代表了所有注册在这个Selector上的channel,这个集合可以通过keys()方法拿到。
2. Selected-key set代表了所有通过select()方法监测到可以进行IO操作的channel,这个集合可以通过selectedKeys()拿到。
3. Cancelled-key set代表了已经cancel了注册关系的channel,在下一个select()操作中,这些channel对应的SelectionKey会从key set和cancelled-key set中移走。这个集合无法直接访问。
以下是select()相关方法的说明:
int select()
监控所有注册的channel,当其中有注册的IO操作可以进行时,该函数返回,并将对应的SelectionKey加入selected-key set。
int select(long timeout)
可以设置超时的select()操作。
int selectNow()
进行一个立即返回的select()操作。
Selector wakeup()
使一个还未返回的select()操作立刻返回。
SelectionKey
代表了Selector和SelectableChannel的注册关系。
Selector定义了4个静态常量来表示4种IO操作,这些常量可以进行位操作组合成一个bit mask。
int OP_ACCEPT
有新的网络连接可以accept,ServerSocketChannel支持这一异步IO。
int OP_CONNECT
代表连接已经建立(或出错),SocketChannel支持这一异步IO。
int OP_READ
int OP_WRITE
代表了读、写操作。
以下是其主要方法:
Object attachment()
返回SelectionKey的attachment,attachment可以在注册channel的时候指定。
Object attach(Object ob)
设置SelectionKey的attachment。
SelectableChannel channel()
返回该SelectionKey对应的channel。
Selector selector()
返回该SelectionKey对应的Selector。
void cancel()
cancel这个SelectionKey所对应的注册关系。
int interestOps()
返回代表需要Selector监控的IO操作的bit mask。
SelectionKey interestOps(int ops)
设置interestOps。
int readyOps()
返回一个bit mask,代表在相应channel上可以进行的IO操作。
ServerSocketChannel
支持异步操作,对应于java.net.ServerSocket这个类,提供了TCP协议IO接口,支持OP_ACCEPT操作。
ServerSocket socket()
返回对应的ServerSocket对象。
SocketChannel accept()
接受一个连接,返回代表这个连接的SocketChannel对象。
SocketChannel
支持异步操作,对应于java.net.Socket这个类,提供了TCP协议IO接口,支持OP_CONNECT,OP_READ和OP_WRITE操作。这个类还实现了ByteChannel,ScatteringByteChannel和GatheringByteChannel接口。
DatagramChannel和这个类比较相似,其对应于java.net.DatagramSocket,提供了UDP协议IO接口。
Socket socket()
返回对应的Socket对象。
boolean connect(SocketAddress remote)
boolean finishConnect()
connect()进行一个连接操作。如果当前SocketChannel是blocking模式,这个函数会等到连接操作完成或错误发生才返回。如果当前SocketChannel是non-blocking模式,函数在连接能立刻被建立时返回true,否则函数返回false,应用程序需要在以后用finishConnect()方法来完成连接操作。
Pipe
包含了一个读和一个写的channel(Pipe.SourceChannel和Pipe.SinkChannel),这对channel可以用于进程中的通讯。
FileChannel
用于对文件的读、写、映射、锁定等操作。和映射操作相关的类有FileChannel.MapMode,和锁定操作相关的类有FileLock。值得注意的是FileChannel并不支持异步操作。
Channels
这个类提供了一系列static方法来支持stream类和channel类之间的互操作。这些方法可以将channel类包装为stream类,比如,将ReadableByteChannel包装为InputStream或Reader;也可以将stream类包装为channel类,比如,将OutputStream包装为WritableByteChannel。
Package java.nio.charset
这个包定义了Charset及相应的encoder和decoder。下面这张UML类图描述了这个包中类的关系,可以将其中Charset,CharsetDecoder和CharsetEncoder理解成一个Abstract Factory模式的实现:
Charset
代表了一个字符集,同时提供了factory method来构建相应的CharsetDecoder和CharsetEncoder。
Charset提供了以下static的方法:
SortedMap availableCharsets()
返回当前系统支持的所有Charset对象,用charset的名字作为set的key。
boolean isSupported(String charsetName)
判断该名字对应的字符集是否被当前系统支持。
Charset forName(String charsetName)
返回该名字对应的Charset对象。
Charset中比较重要的方法有:
String name()
返回该字符集的规范名。
Set aliases()
返回该字符集的所有别名。
CharsetDecoder newDecoder()
创建一个对应于这个Charset的decoder。
CharsetEncoder newEncoder()
创建一个对应于这个Charset的encoder。
CharsetDecoder
将按某种字符集编码的字节流解码为unicode字符数据的引擎。
CharsetDecoder的输入是ByteBuffer,输出是CharBuffer。进行decode操作时一般按如下步骤进行:
1. 调用CharsetDecoder的reset()方法。(第一次使用时可不调用)
2. 调用decode()方法0到n次,将endOfInput参数设为false,告诉decoder有可能还有新的数据送入。
3. 调用decode()方法最后一次,将endOfInput参数设为true,告诉decoder所有数据都已经送入。
4. 调用decoder的flush()方法。让decoder有机会把一些内部状态写到输出的CharBuffer中。
CharsetDecoder reset()
重置decoder,并清除decoder中的一些内部状态。
CoderResult decode(ByteBuffer in, CharBuffer out, boolean endOfInput)
从ByteBuffer类型的输入中decode尽可能多的字节,并将结果写到CharBuffer类型的输出中。根据decode的结果,可能返回3种CoderResult:CoderResult.UNDERFLOW表示已经没有输入可以decode;CoderResult.OVERFLOW表示输出已满;其它的CoderResult表示decode过程中有错误发生。根据返回的结果,应用程序可以采取相应的措施,比如,增加输入,清除输出等等,然后再次调用decode()方法。
CoderResult flush(CharBuffer out)
有些decoder会在decode的过程中保留一些内部状态,调用这个方法让这些decoder有机会将这些内部状态写到输出的CharBuffer中。调用成功返回CoderResult.UNDERFLOW。如果输出的空间不够,该函数返回CoderResult.OVERFLOW,这时应用程序应该扩大输出CharBuffer的空间,然后再次调用该方法。
CharBuffer decode(ByteBuffer in)
一个便捷的方法把ByteBuffer中的内容decode到一个新创建的CharBuffer中。在这个方法中包括了前面提到的4个步骤,所以不能和前3个函数一起使用。
decode过程中的错误有两种:malformed-input CoderResult表示输入中数据有误;unmappable-character CoderResult表示输入中有数据无法被解码成unicode的字符。如何处理decode过程中的错误取决于decoder的设置。对于这两种错误,decoder可以通过CodingErrorAction设置成:
1. 忽略错误
2. 报告错误。(这会导致错误发生时,decode()方法返回一个表示该错误的CoderResult。)
3. 替换错误,用decoder中的替换字串替换掉有错误的部分。
CodingErrorAction malformedInputAction()
返回malformed-input的出错处理。
CharsetDecoder onMalformedInput(CodingErrorAction newAction)
设置malformed-input的出错处理。
CodingErrorAction unmappableCharacterAction()
返回unmappable-character的出错处理。
CharsetDecoder onUnmappableCharacter(CodingErrorAction newAction)
设置unmappable-character的出错处理。
String replacement()
返回decoder的替换字串。
CharsetDecoder replaceWith(String newReplacement)
设置decoder的替换字串。
CharsetEncoder
将unicode字符数据编码为特定字符集的字节流的引擎。其接口和CharsetDecoder相类似。
CoderResult
描述encode/decode操作结果的类。
CodeResult包含两个static成员:
CoderResult OVERFLOW
表示输出已满
CoderResult UNDERFLOW
表示输入已无数据可用。
其主要的成员函数有:
boolean isError()
boolean isMalformed()
boolean isUnmappable()
boolean isOverflow()
boolean isUnderflow()
用于判断该CoderResult描述的错误。
int length()
返回错误的长度,比如,无法被转换成unicode的字节长度。
void throwException()
抛出一个和这个CoderResult相对应的exception。
CodingErrorAction
表示encoder/decoder中错误处理方法的类。可将其看成一个enum类型。有以下static属性:
CodingErrorAction IGNORE
忽略错误。
CodingErrorAction REPLACE
用替换字串替换有错误的部分。
CodingErrorAction REPORT
报告错误,对于不同的函数,有可能是返回一个和错误有关的CoderResult,也有可能是抛出一个CharacterCodingException。
分享到:
相关推荐
在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来...
详细介绍NIO技术
博客地址:http://blog.csdn.net/u010156024/article/details/44310709 欢迎访问。 代码中详细讲述了Java io流和nio流的用法,可以参考学习。
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
JavaNIO_API帮助文档详解,对于开发NIO很有帮助
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...
Java NIO英文高清原版
Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...
Java NIO详解
java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...
java NIO.zip
讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用
Java_NIO_API详解[参照].pdf
java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket
NIO的Api的详细讲解,非常详细,对方法和参数的作用就解释的非常清楚。
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-...
java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较