`
wufan0023
  • 浏览: 29084 次
  • 性别: Icon_minigender_1
  • 来自: hefei
社区版块
存档分类
最新评论

Java NIO API详解 (II)[z]

阅读更多

SelectableChannel

这个抽象类是所有支持异步IO操作的channel(如DatagramChannelSocketChannel)的父类。SelectableChannel可以注册到一个或多个Selector上以进行异步IO操作。

SelectableChannel可以是blockingnon-blocking模式(所有channel创建的时候都是blocking模式),只有non-blockingSelectableChannel才可以参与异步IO操作。

SelectableChannel configureBlocking(boolean block)  --- 设置blocking模式。

boolean isBlocking()     ---  返回blocking模式。

通过register()方法,SelectableChannel可以注册到Selector上。

int validOps()

返回一个bit mask,表示这个channel上支持的IO操作。当前在SelectionKey中,用静态常量定义了4IO操作的bit值:OP_ACCEPTOP_CONNECTOP_READOP_WRITE

SelectionKey register(Selector sel, int ops)

将当前channel注册到一个Selector上并返回对应的SelectionKey。在这以后,通过调用Selectorselect()函数就可以监控这个channelops这个参数是一个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)

返回该channeSelector上的注册关系所对应的SelectionKey。若无注册关系,返回null

Selector

Selector可以同时监控多个SelectableChannelIO状况,是异步IO的核心。

Selector open()

       Selector的一个静态方法,用于创建实例。

在一个Selector中,有3SelectionKey的集合:

1. key set代表了所有注册在这个Selector上的channel,这个集合可以通过keys()方法拿到。

2. Selected-key set代表了所有通过select()方法监测到可以进行IO操作的channel,这个集合可以通过selectedKeys()拿到。

3. Cancelled-key set代表了已经cancel了注册关系的channel,在下一个select()操作中,这些channel对应的SelectionKey会从key setcancelled-key set中移走。这个集合无法直接访问。

以下是select()相关方法的说明:

int select()

监控所有注册的channel,当其中有注册的IO操作可以进行时,该函数返回,并将对应的SelectionKey加入selected-key set

int select(long timeout)

       可以设置超时的select()操作。

int selectNow()

       进行一个立即返回的select()操作。

Selector wakeup()

       使一个还未返回的select()操作立刻返回。

SelectionKey

代表了SelectorSelectableChannel的注册关系。

Selector定义了4个静态常量来表示4IO操作,这些常量可以进行位操作组合成一个bit mask

int OP_ACCEPT

有新的网络连接可以acceptServerSocketChannel支持这一异步IO

int OP_CONNECT

       代表连接已经建立(或出错),SocketChannel支持这一异步IO

int OP_READ

int OP_WRITE

       代表了读、写操作。

 

以下是其主要方法:

 

Object attachment()

返回SelectionKeyattachmentattachment可以在注册channel的时候指定。

Object attach(Object ob)

       设置SelectionKeyattachment

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_CONNECTOP_READOP_WRITE操作。这个类还实现了ByteChannelScatteringByteChannelGatheringByteChannel接口。

DatagramChannel和这个类比较相似,其对应于java.net.DatagramSocket,提供了UDP协议IO接口。

 

Socket socket()

       返回对应的Socket对象。

boolean connect(SocketAddress remote)

boolean finishConnect()

connect()进行一个连接操作。如果当前SocketChannelblocking模式,这个函数会等到连接操作完成或错误发生才返回。如果当前SocketChannelnon-blocking模式,函数在连接能立刻被建立时返回true,否则函数返回false,应用程序需要在以后用finishConnect()方法来完成连接操作。

 

Pipe

包含了一个读和一个写的channel(Pipe.SourceChannelPipe.SinkChannel),这对channel可以用于进程中的通讯。

 

FileChannel

用于对文件的读、写、映射、锁定等操作。和映射操作相关的类有FileChannel.MapMode,和锁定操作相关的类有FileLock。值得注意的是FileChannel并不支持异步操作。

 

Channels

这个类提供了一系列static方法来支持stream类和channel类之间的互操作。这些方法可以将channel类包装为stream类,比如,将ReadableByteChannel包装为InputStreamReader;也可以将stream类包装为channel类,比如,将OutputStream包装为WritableByteChannel

 

 

Package java.nio.charset

这个包定义了Charset及相应的encoderdecoder。下面这张UML类图描述了这个包中类的关系,可以将其中CharsetCharsetDecoderCharsetEncoder理解成一个Abstract Factory模式的实现:

 

Charset

代表了一个字符集,同时提供了factory method来构建相应的CharsetDecoderCharsetEncoder

Charset提供了以下static的方法:

SortedMap availableCharsets()

       返回当前系统支持的所有Charset对象,用charset的名字作为setkey

boolean isSupported(String charsetName)

       判断该名字对应的字符集是否被当前系统支持。

Charset forName(String charsetName)

       返回该名字对应的Charset对象。

Charset中比较重要的方法有:

String name()

       返回该字符集的规范名。

Set aliases()

       返回该字符集的所有别名。

CharsetDecoder newDecoder()

       创建一个对应于这个Charsetdecoder

CharsetEncoder newEncoder()

       创建一个对应于这个Charsetencoder

CharsetDecoder

将按某种字符集编码的字节流解码为unicode字符数据的引擎。

CharsetDecoder的输入是ByteBuffer,输出是CharBuffer。进行decode操作时一般按如下步骤进行:

1. 调用CharsetDecoderreset()方法。(第一次使用时可不调用)

2. 调用decode()方法0n次,将endOfInput参数设为false,告诉decoder有可能还有新的数据送入。

3. 调用decode()方法最后一次,将endOfInput参数设为true,告诉decoder所有数据都已经送入。

4. 调用decoderflush()方法。让decoder有机会把一些内部状态写到输出的CharBuffer中。

CharsetDecoder reset()

       重置decoder,并清除decoder中的一些内部状态。

CoderResult decode(ByteBuffer in, CharBuffer out, boolean endOfInput)

ByteBuffer类型的输入中decode尽可能多的字节,并将结果写到CharBuffer类型的输出中。根据decode的结果,可能返回3CoderResultCoderResult.UNDERFLOW表示已经没有输入可以decodeCoderResult.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

分享到:
评论

相关推荐

    java.nio API详解

    在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来...

    NIO开发API详解

    详细介绍NIO技术

    Java 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 NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    JavaNIO_API帮助文档详解

    JavaNIO_API帮助文档详解,对于开发NIO很有帮助

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO 视频教程

    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 NIO详解(学习资料)

    Java NIO详解

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    java NIO.zip

    java NIO.zip

    java NIO 中文版

    讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用

    Java_NIO_API详解[参照].pdf

    Java_NIO_API详解[参照].pdf

    java nio 实现socket

    java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket

    Java_NIO_API详解

    NIO的Api的详细讲解,非常详细,对方法和参数的作用就解释的非常清楚。

    Java Nio selector例程

    java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...

    Java NIO实战开发多人聊天室

    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 NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较

Global site tag (gtag.js) - Google Analytics