- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在 JDK 1.4 以前,Java 的 IO 操作集中在 java.io 这个
包中,是基于流的同步(blocking)API。对于大多数应用
来说,这样的 API 使用很方便,然而,一些对性能要求较高
的应用,尤其是服务端应用,往往需要一个更为有效的方式
来处理 IO。从 JDK 1.4 起,NIO API 作为一个基于缓冲区,
并 能 提供 异步( non-blockin g)I O 操作的 API 被引入。本文对
其进行深入的介绍。
NIO API 主要集中在 java. nio 和它的 subpackages 中:
java. nio
定义了 Buffer 及其数据类型相关的子类。其中被 java.nio.channels 中的类用来进行 IO 操
作的 ByteBuffer 的作用非常重要。
java.nio.channels
定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯上的实现。通过
Selector 这个类,还提供了进行异步 IO 操作的办法。这个包可以说是 NIO API 的核心。
java.nio.channels.spi
定义了可用来实现 channel 和 selector API 的抽象类。
java.nio.charset
定义了处理字符编码和解码的类。
java.nio.charset.spi
定义了可用来实现 charset API 的抽象类。
java.nio.channels.spi 和 java.nio.charset.spi 这两个包主要被用来对现有 NIO API 进行扩展,在
实际的使用中,我们一般只和另外的 3 个包打交道。下面将对这 3 个包一一介绍。
Package java.nio
这个包主要定义了 Buffer 及其子类。Buffer 定义了一个线性存放 primitive type 数据的容器接口 。
对于除 boolean 以外的其他 primitive type,都有一个相应的 Buffer 子类,ByteBuffer 是其中最
重要的一个子类。
下面这张 UML 类图描述了 java. ni o 中的类的关系:
Buffer
定义了一个可以线性存放 primitive type 数据的容器接口。 Buffer 主要包含了与类型( byte,
char…)无关的功能。值得注意的是 Buffer 及其子类都不是线程安全的。
每个 Buffer 都有以下的属性:
capacity
这个 Buffer 最多能放多少数据。 capacity 一般在 buf fer 被创建的时候指定。
limit
在 Buffer 上进行的读写操作都不能越过这个下标。当写数据到 buf fer 中时,limit 一般和
capacity 相等,当读数据时, limit 代表 buf fer 中有效数据的长度。
position
读/写操作的当前下 标。当使用 buf fer 的相对位置进行读 /写操作时,读/写会从这个下标进 行,
并在操作完成后, buf fer 会更新下标的值。
mark
一个临时存放的位置下标。调用 mark()会将 mark 设为当前的 position 的值,以后调用 reset()
会将 position 属性设置为 mark 的值。mark 的值总是小于等于 position 的值,如果将 position
的值设的比 mark 小,当前的 mark 值会被抛弃掉。
这些属性总是满足以下条件:
0 = mark = position = limit = capacity
limit 和 position 的值除了通过 limit()和 position()函数来设置,也可以通过下面这些函数来改变 :
Buffer clear()
把 position 设为 0,把 limit 设为 capacity,一般在把数据写入 Buffer 前调用。
Buffer flip()
把 limit 设为当前 position,把 position 设为 0,一般在从 Buffer 读出数据前调用。
Buffer rewind()
把 position 设为 0,limit 不变,一般在把数据重写入 Buffer 前调用。
Buffer 对象有可能是只读的,这时,任何对该对象的写操作都会触发一个
ReadOnlyBufferException。isReadOnly()方法可以用来判断一个 Buffer 是否只读。
ByteBuffer
在 Buffer 的子类中,ByteBuffer 是一个地位较为特殊的类,因为在 java.io.channels 中定义的各
种 channel 的 IO 操作基本上都是围绕 ByteBuffer 展开的。
By
您可能关注的文档
最近下载
- 环境保护与全球气候变化主题班会PPT课件.pptx VIP
- 现浇结构模板安装检验批质量验收.pdf
- 网约车考试上海网约车从业资格证考试试卷.doc VIP
- 基于教学评一体化的《大数的认识》大单元项目式教学设计.docx VIP
- CSC-163A-DA-G [V2.01] [5476] 装置使用说明书.pdf VIP
- 剑桥国际少儿英语册精编单元文本.pdf VIP
- 关于英国东印度公司的转型研究:1660-1784.pdf VIP
- JC_T 949-2021 混凝土制品用脱模剂.docx VIP
- 基于教学评一体化的《小数乘法》大单元项目式设计.docx VIP
- WW_T 0125-2025 文物建筑防火设计规范.docx
文档评论(0)