- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaNIO与IO的区别和比较
Java NIO与IO的区别和比较
导读J2SE1.4以上版本中发布了全新的I/O类库。本文将通过一些实例来简单介绍NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道。
一. 介绍NIONIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。1. Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。2. Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作。3. Channels:包含socket,file和pipe三种管道,它实际上是双向交流的通道。4. Selector:它将多元异步I/O操作集中到一个或多个线程中(它可以被看成是Unix中select()函数或Win32中WaitForSingleEvent()函数的面向对象版本)。二. 回顾传统在介绍NIO之前,有必要了解传统的I/O操作的方式。以网络应用为例,传统方式需要监听一个ServerSocket,接受请求的连接为其提供服务(服务通常包括了处理请求并发送响应)图一是服务器的生命周期图,其中标有粗黑线条的部分表明会发生I/O阻塞。图一可以分析创建服务器的每个具体步骤。首先创建ServerSocketServerSocket server=new ServerSocket(10000);然后接受新的连接请求 Socket newConnection=server.accept();对于accept方法的调用将造成阻塞,直到ServerSocket接受到一个连接请求为止。一旦连接请求被接受,服务器可以读客户socket中的请求。InputStream in = newConnection.getInputStream();InputStreamReader reader = new InputStreamReader(in);BufferedReader buffer = new BufferedReader(reader);Request request = new Request();while(!request.isComplete()) {String line = buffer.readLine();request.addLine(line);}这样的操作有两个问题,首先BufferedReader类的readLine()方法在其缓冲区未满时会造成线程阻塞,只有一定数据填满了缓冲区或者客户关闭了套接字,方法才会返回。其次,它回产生大量的垃圾,BufferedReader创建了缓冲区来从客户套接字读入数据,但是同样创建了一些字符串存储这些数据。虽然BufferedReader内部提供了StringBuffer处理这一问题,但是所有的String很快变成了垃圾需要回收。同样的问题在发送响应代码中也存在Response response = request.generateResponse();OutputStream out = newConnection.getOutputStream();InputStream in = response.getInputStream();int ch;while(-1 != (ch = in.read())) {out.write(ch);}newConnection.close();类似的,读写操作被阻塞而且向流中一次写入一个字符会造成效率低下,所以应该使用缓冲区,但是一旦使用缓冲,流又会产生更多的垃圾。传统的解决方法通常在Java中处理阻塞I/O要用到线程(大量的线程)。一般是实现一个线程池用来处理请求,如图二图二线程使得服务器可以处理多个连接,但是它们也同样引发了许多问题。每个线程拥有自己的栈空间并且占用一些CPU时间,耗费很大,而且很多时间是浪费在阻塞的I/O操作上,没有有效的利用CPU。三. 新I/O1. Buffer传统的I/O不断的浪费对象资源(通常是String)。新I/O通过使用Buffer读写数据避免了资源浪费。Buffer对象是线性的,有序的数据集合,它根据其类别只包含唯一的数据类型。java.nio.Buffer 类描述 java.nio.ByteBuffer 包含字节类型。 可以从ReadableByteChannel中读在 WritableByteChannel中写 java.nio.MappedByteBuffer 包含字节类型,直接在内存某一区域映射 java.nio.CharBuffer 包含字符类型,不能写入通道 java.nio.DoubleBuffer
您可能关注的文档
- Ilearningpreventspossiblecausesofnonuniformbandwidthallocationamongrequestingmessages.doc
- important数据结构.doc
- IMagineWorldmatrix使用说明.doc
- Improved Kalman Filter Algorithm of GPS.doc
- In Search of the Root Cause.doc
- i1声波的产生和传播(教案)1.doc
- HyperMesh学习的一些建议:.doc
- INDEPENDENCE OF CENTRAL BANK AND INFLATION.doc
- inference.doc
- informix精华集锦.doc
- 世界肝炎日-关注肝脏健康知识.pptx
- 统编版小学一年级语文下册教学课件《端午粽》.pptx
- 2025年文化场馆建设项目社会稳定风险评估与政策支持研究报告.docx
- 2025年工业互联网发展实施方案评估报告.docx
- 2025年工业废气深度净化技术环保投资分析与建议报告.docx
- 医疗器械注册审批制度改革对行业市场营销策略影响研究报告.docx
- 2025年美妆个性化定制服务行业市场细分领域市场细分领域政策法规解读报告.docx
- 互联网医疗健康行业政策法规影响及应对策略研究报告.docx
- 公众参与视角下2025年环境影响评价机制的跨区域对比与启示.docx
- 农村土地流转规范化管理中的土地流转政策与农业国际合作项目报告.docx
最近下载
- 人教版八下英语语法.doc VIP
- 七年级历史下期末试卷2012.doc VIP
- 2024年上半年教师资格证考试《教育教学知识与能力》(小学)真题.docx
- 2022-2023年八年级会考一模生物试卷(山东省青岛市市北区).docx VIP
- 恒生PB系统介绍.pptx VIP
- U盘盖注塑模模具设计.doc VIP
- 2024年中考语文复习【整本书阅读之12部名著内容勾连题】精练附答案解析.docx VIP
- 2025年安全月主题宣贯课件ppt65页.pptx VIP
- 小型水库雨水情测报和大坝安全监测设施建设与运行技术指南.pdf VIP
- 2024年上半年教师资格证考试《教育教学知识与能力》(小学)真题.pdf
文档评论(0)