使用NIO提高Java应用输入输出性能.doc

上传人:gs****r 文档编号:1754944 上传时间:2019-03-14 格式:DOC 页数:5 大小:105KB
下载 相关 举报
使用NIO提高Java应用输入输出性能.doc_第1页
第1页 / 共5页
使用NIO提高Java应用输入输出性能.doc_第2页
第2页 / 共5页
使用NIO提高Java应用输入输出性能.doc_第3页
第3页 / 共5页
使用NIO提高Java应用输入输出性能.doc_第4页
第4页 / 共5页
使用NIO提高Java应用输入输出性能.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、1使用 NIO 提高 Java 应用输入输出性能摘要:文章介绍了 I/O 在计算机系统中的重要性,指出 Java 语言早期的 Stream 式 I/O 模型存在性能问题,引出 NIO 模型及其两个关键接口 Channel 和 Buffer,介绍了它们的创建和使用方法,并从源代码的角度给出其具体说明。 关键词:输入输出 NIO 块操作 Channel Buffer 0 引言 I/O 是“输入输出”的英文缩写,指系统间数据交换的过程。I/O 系统是计算机系统的重要组成部分,承担着计算机系统内部之间或与外部沟通的桥梁。由于其重要性,现代操作系统均内置了 I/O 操作的底层实现,软件开发人员的任务是设

2、计具体的调用形式和过程。 在早期的 Java 语言中,I/O 操作主要依靠 Stream 模型实现,类库中包含了一些特色鲜明的 Stream 类供开发人员反复利用。该模型将 I/O 看作字节的单列顺序移动,这种思想便于软件开发人员学习和使用,能够方便地建立编程框架,编写出简洁而优美的代码。但是,有一个不容忽视的问题在数据密集型应用中,通常不能满足性能需求,这是因为Stream 模型每次只读取一个字节。当时,开发人员通过编写 Native 代码绕过 Stream 模型,缺点是付出安全性和可移植性等方面的代价。 为了解决上述问题,Java 语言引入了 NIO,它以标准 Java 代码的方式弥补了

3、Stream 模型的不足,并提供了一些新的功能。 21 NIO 简介 NIO 是“新的输入输出”的英文缩写,通过利用操作系统的底层优化,以块的方式实现高速的 I/O 操作。它为所有的原始类型提供 Buffer 支持、字符集编码解码解决方案、锁功能、内存映射文件以及多路非阻塞式网络 I/O 。NIO 的核心是 Channel 和 Buffer 两个接口,几乎在每个 I/O操作中都要使用它们。 2 Buffer 与 Channel 在 NIO 中,所有数据都是缓冲处理的,Buffer 接口充当着容器的角色。本质上,Buffer 实现类包装一个特定长度的基本数据类型数组,提供高级的访问方法,跟踪读、

4、写进程。在 I/O 操作时,数据首先进入Buffer 对象,然后从 Buffer 对象中读取或者向其中写入。 Channel 的角色类似于 Stream,但前者有两个明显优势,其一是可以一次读取或写入一个 Buffer 的数据而非一个 Byte;其二是 Channel 是双向的,既可以读,也可以写,甚至同时读和写,这更符合一些操作系统的底层实现。 3 输入数据 这里以读入文件数据为例说明 NIO 输入功能的使用方法,分为三个简单步骤。第一步,获取 FileChannel: FileInputStream fis = new FileInputStream( “foo“ ) ; FileChan

5、nel fc = fis.getChannel() ; 第二步,创建一个缓冲区,缓冲区的类型和大小依实际需求而定,这里创建一个可容纳 1024 字节的缓冲区: 3ByteBuffer buffer = ByteBuffer.allocate( 1024 ) ; 第三步,使用 Channel 将数据读入到 Buffer 中: fc.read( buffer ) ; 在这个过程中,不需要告诉 Channel 需要读多少数据,Buffer 内部机制会决定待读取的数据量。 通过以上三步,文件中的数据已经以字节的形式存储在 Buffer 中,可以使用 get 方法取出并做后续处理。 4 输出数据 与输入

6、数据类似,这里同样以文件数据的形式说明 NIO 输出功能的使用方法,分为三个简单步骤。第一步,获取 FileChannel: FileOutputStream fos = new FileOutputStream( “foo“ ) ;FileChannel fc = fos.getChannel() ; 第二步,创建一个缓冲区,缓冲区的类型和大小依实际需求而定,这里创建一个可容纳 1024 字节的缓冲区,然后向其中填入待写入的数据:其中,put 方法与上文 get 方法相对,用于向 Buffer 中添加数据,新的 flip 方法设置 Buffer 的内部状态,通知 Buffer 准备好即将进行

7、的输出操作。 第三步,使用 Channel 将从 Buffer 中写出: fc.write( buffer ) ; 如果 Buffer 中的数据小于创建时的长度,写出操作会根据实际长度4大小进行调整。 5 输入输出结合应用 这里给出一个数据中转的例子,用以说明如何将一个 Buffer 实例同时应用到读和写的过程中。 其中,如果 read 方法的返回值为-1,表明数据已经读完;新的clear 方法与 flip 方法类似,重设 Buffer 内部状态,使它准备接收新的数据。 6 总结 以上示例中没有包含异常处理的代码,目的在于向读者清晰明了地说明 NIO 的使用方法,从中可以看出,NIO 并没有明

8、显增加 Java 语言程序的代码量,与 Native 代码方式比较,在满足安全性和可移植性要求的情况下,提供了相似的性能,降低了后期维护成本,不失为一种优秀的I/O 模型,应该被推广使用。 参考文献: 1李晓华.深入 Java 编程技术讲座之六-Java 输入输出.北京:电脑编程技巧与维护J.1999,3. 2封玮,周世平.基于 Java NIO 的非阻塞通信的研究与实现。北京:计算机系统应用J.2004,9. 3姜力.基于 Java NIO 反应器模式设计与实现.大庆:大庆师范学院学报N.2008,3. 4曾自强.基于 NIO 的 java 高性能网络应用的技术研究J.北京:北京邮电大学.2009,2. 55张雷.基于 JAVA 技术的输入输出流系统应用性分类研究.重庆:自动化与仪器仪表J.2011,4. 6蔡天鸣,王若愚.Java SE7 平台下的 NIO.2 探析.武汉:软件导刊J.2011,8.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 学科论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。