配置通道
你可以配置通道进行阻塞或非阻塞操作。在阻塞方式下调用读、写或其他操作时,直到操作完成才能返回。例如,在缓慢的套接字上进行大型写操作可能要用很长时间。在非阻塞模式下,在缓慢的套接字上写入大型缓冲器只是排列数据(可能在一个操作系统缓冲器,或在网卡上的缓冲器中)并立即返回。线程可能转向其他任务,而由操作系统的输入/输出管理器完成工作。
从文件通道中移出,可将我们带到读出及写入套接字的连接通道。你还能够以阻塞或非阻塞方式应用这些通道。在阻塞方式下,它们视客户或服务器而替代连接或接受调用。在非阻塞方式下,就没有对应项。列表A是一个你将字符串”Hello there”送到1234端口并获得回应的例子。
NIO中的缓冲器
缓冲器类提供一种将一组原始数据元素存储在一个内存容器中的机制。除内容外,缓冲器有一个位置,即下一个读或写元素的目录;以及一个限制,即不应被读或写的第一个元素目录。基本的Buffer类定义了这些属性,以及清除、浏览和倒转的方法;标记当前位置、重设定一个标志位置的方法。每个非布尔原始类型:ByteBuffer、CharBuffer、DoubleBuffer和LongBuffer等都有一个缓冲器类。
这些缓冲器类每个支持一组读写数据的get-和put-方法,每个能够被读或写进/出对应的缓冲器类型的原始类型都有许多get-和put-方法。例如,对ByteBuffer而言,就有getChar()、putChar()、getByte()、putByte()、getShort()、putShort(),以及其他一些方法。
直接ByteBuffer有一个特定的形式,称之为MappedByteBuffer。这个类表示映射到一个文件的一个缓冲器字节。要将文件映射到MappedByteBuffer中,首先必须为文件获得一个通道。建立MappedByteBuffer后,就可以像其他ByteBuffer一样对它进行访问。在这个特例中,它是只读性质的,所以任何向putXxxx()方法中写入信息的尝试都会产生一个NonWritableChannelException异常。
java.nio.charset软件包中包含了在字节与Unicode字符间转换的字符集、解码器与编码器。解码器是一个将特定字符集中的字节转换为字符的引擎;编码器是一个将字符转换为字节的引擎。在列表A中,解码器与编码器用来对闲置的请求与回应进行重新编码。
非阻塞操作
非阻塞操作是新输入/输出API最常见与最广泛应用的功能。为将通道配置为非阻塞方式,必须调用configureBlocking()方法。使用SocketChannel,可用下面的代码来完成:
String host = ...;
InetSocketAddress socketAddress =
?new InetSocketAddress(host, 1234);
channel = SocketChannel.open();
channel.configureBlocking(false);
channel.connect(socketAddress);
调用connect()方法后,它将立即返回执行情况。然后,你必须指出如何处理这样的通道连接。如果通道是可选项的(即它能够通过Selector类并扩张SelectableChannel类来多元化),你就可以用Selector(通过register()方法)来注册通道,然后签署特殊事件。在指定的操作发生时,它会通知你。这些事件由SelectionKey类的域反映定。可用以下代码来完成:
?Selector selector = Selector.open();
?channel.register(selector,
SelectionKey.OP_CONNECT | SelectionKey.OP_READ);
为查明是否发生了有趣的操作,可在它自己的线程中加入一个while循环。
当你收到通知时,它可能与你感兴趣的选定事件有关。你将通过selectedKeys方法及重复获得现成对象的Set。Set中的元素是一个SelectionKey实例。只要你签署了一个ChannelSocket的OP_CONNECT和OP_READ事件,你就必须检查isConnectable()和isReadable()属性(见列表B)。由于在你处理的时候,这组通道可能发生改变,我们正在用remove()方法消除当前处理的条目。
结论
虽然许多开发者认为新的输入/输出功能只提供非阻塞输入/输出操作,但这种看法并不准确。新的输入/输出功能包含几个新概念(如通道)以及通过缓冲器、字符集和文件映射进行输入/输出功能的新方法。java.nio软件包帮助开发者在数据处理时取得更强的性能及更佳的扩展性。
欲了解与NIO特性有关的深入细节,请查看Sun的JSR 51和Sun NIO指导。
Peter V. Mikhalenko是Sun的一位认证专家,也是Deutsche银行的商业顾问。
责任编辑:张琎
查看本文的国际来源
|