




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
调用Java NIO提高文件读写速度2011年11月20日 22:11:33 Java NIO的出现旨在提高文件的读写速度,当然IO用NIO重新实过,所以我们不用显示的调用NIO也能享受这种高效的文件读写。Java NIO的高效得益于其两大助手:Channel(管道)和Buffer(缓冲器)。当然这两个得力助手的年龄远远比java大!力求简单易懂的把知识讲解给大家,我举一个例子来说明一下这两元大将是如何在java NIO中配合工作的。中国古代有一种传统的吸烟器具-水烟袋。我想用这个东西来模拟一下Channel和Buffer的工作原理。不求说的好,力求准确无误。分析一下水烟袋是如何工作的:第一步,准备工作,准备好上等烟丝;第二步,将水斗中装入适量的水,烟仓中装满烟丝并插入水斗中,然后再将烟管插入水斗中;第三步,点燃烟丝并吸气。香烟从烟仓产生,经过水的过滤进入水上的空闲区。第四步,享受吸烟的快感.从这个例子中我们提取出主要对象烟,来分析一下它的运动轨迹。烟仓把烟生产出来,经过水的过滤飘到水上面的空闲区域,然后通过烟管进入人的体内。如果上面的过程大家理解了,明白了,那么java NIO你已经了解了50%,至少你已经知道它的工作原理了。因为用NIO处理的数据和用水烟袋中吸烟很相似。我们分析一下NIO的工作原理,非常简单。当然和吸烟一样我们首先必须有要用NIO来处理需求的欲望(这好比你想要吸烟了),比方说我想要将C盘下面的wk.txt文件进行备份,备份文件的名称为wk-bak.txt。类比刚刚吸烟的那个过程:步骤一:准备工作,确定文件的位置,并将程序不可直接操作的文件转换成字符流的形式(这一步和上边吸烟实例的第一步没有什么差别,只是进行一些简单的准备工作)。1. StringinFile=C:wk.txt; 2. StringoutFile=C:wk-bak.txt; 3. FileInputStreaminf=newFileInputStream(inFile); 4. FileOutputStreamoutf=newFileOutputStream(outFile); 5. ByteBufferbuffer=ByteBuffer.allocate(1024);1. ByteBufferbuffer=ByteBuffer.allocate(1024);步骤二:创建文件输入管道,和文件输出管道。(这一步与上边吸烟的第二部稍有差别,因为Channel和Buffer是在读写的时候才发生的连接动作)1. /准备文件读取的管道-相当于烟仓和烟管FileChannelinFc=inf.getChannel(); 2. FileChanneloutFc=outf.getChannel(); 3. CharsetcharSet=Charset.forName(utf-8); 4. /进行编码解码-相当于水斗中水的过滤作用 5. CharsetDecoderdecoder=charSet.newDecoder(); 6. CharsetEncoderencoder=charSet.newEncoder(); 步骤三:开始进行文件备份工作。1. while(true) 2. /准备向Buffer中写入数据-相当于点燃烟丝,完事具备只欠东风 3. buffer.clear(); 4. /进行字符编码-相当于水的过滤作用 5. CharBuffercb=decoder.decode(buffer); 6. ByteBufferbb=encoder.encode(cb); 7. 8. /数据经过编码以后暂存缓冲区-相当于经过水过滤后的烟暂停在水斗中 9. intt=inFc.read(bb); 10. if(t=-1) 11. break; 12. 13. bb.flip(); 14. /将字节码写入目标文件-相当于烟已经进入到嘴里 15. outFc.write(bb); 16. 步骤四:检查文件是否备份成功。发现C盘下面多了一个wk-bak.txt的文件,内容与wk.txt一摸一样。接下来享受java带给你的快感.上面的例子估计大家已经理解的差不多了,当然如果深究也会有一些不太妥当的地方,但是不要较真,目的是学习NIO,并不是吸烟。如果感觉你可以了那么就请把上面的例子补充完整,运行一下,享受一下NIO的威武(当然字符编码并不是必须的,只是让这个例子显得完整一点)。好吧如果你理解了上面的东西,并且真正的补全了文件备份的小程序,那么就来进行稍微深入一点的学习吧。上文我提到了举吸烟的例子是有欠妥当的,其中之一就是Buffer的内部机制和水斗简单的过滤功能是不一样的。还有字符编码那一块也不是在Buffer内部实现的东西,decoder和encoder是针对Buffer的两个工具。那我们接下来分析一下Buffer内部机制到底不一样在哪里呢(主要分析常用的两个方法;clear(),flip())?来吧,打开Buffer的源码(摘取有用的部分):1. publicabstractclassBuffer 2. /Invariants:mark=position=limit=capacity 3. privateintmark=-1; 4. privateintposition=0; 5. privateintlimit; 6. privateintcapacity; 7. publicfinalBufferclear() 8. position=0; 9. limit=capacity; 10. mark=-1; 11. returnthis; 12. 13. publicfinalBufferflip() 14. limit=position; 15. position=0; 16. mark=-1; 17. returnthis; 18. 首先我们要明确一点,所谓的缓冲器仅仅是一个多功能的数组。可能在这个Buffer类中没有体现,但是如果我们打开ByteBuffer的源码会有byte的数组,打开CharBuffer的源码会有char的数组。因为Buffer是所有缓冲器的父类,所以他它不能预计会有多少种缓冲器,所以索性让儿子们自己实现去吧。既然知道了缓冲器是一个多功能的数组,那么我们用画图的形式来分析一下上面Buffer的源码。假设我们定义了一个8个单位大的缓冲区,如上图(其实Buffer也就是这么一个东西)。首先告诉大家那三个重要的关于缓冲区状态的的属性:capacity:缓冲区的容量;limit:缓冲区还有多少数据能够取出或者缓冲区还有多少容量用于存放数据;position:相当于一个游标(cursor),记录我们从哪里开始写数据,从哪里开始读数据。刚还说到flip()和clear()是Buffer的两个重要的方法,因为它们两个方法决定了缓冲是否能正常的进行读写工作。当我们要想从缓冲区中写数据的时候必须先执行flip()方法,当我们要想从缓冲区中读数据时必须先执行clear()方法。第一次向Buffer中写入数据时,执行一次flip()方法以后,Buffer的结构变成了这样:position指向了第一个可以存取数据的0号位,limit和capacity同时指向最高位。假如第一次我们向Buffer中写入了3单位的数据,我们再次执行flip()方法则Buffer的结构会变成上图的所示。但是经过flip()的改造后position总是指向Buffer中第一个可用的位置。那么,未执行flip()方法以前position在哪里呢?很简单,指向最后一个数据的位置。当我们想要从Buffer中读取数据时,执行clear()方法,Buffer的内部结构变成了上图所示,position指向了可读数据的首位,limit指向了原来position的位置。从上面的几幅图中我们看出:capacity代表了Buffer的容量是不变的,limit与position的差总是表示Buffer总可以读的数据,或者Buffer中可以写数据的容量。还有position总是小于等于limit,limit总是小于等于capacity。其实到这里我们已
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玛丽波尔卡打击乐课件
- 市场监管放心码信息归集和公示规范编制说明
- 安全教育活动培训制度内容课件
- 狼和鸭子课件
- 高校青蓝工程方案(3篇)
- 电池碰撞实验工程方案(3篇)
- 牧场安全规范培训内容
- 农业品牌创新驱动:2025年资金申请战略研究报告
- 历年保研面试题库及答案
- 安全教育培训通知书课件
- 专业技术职务资格申报材料真实性承诺书
- 脓毒症指南课件
- 生产副总经理岗位职责标准版本(五篇)
- 对颈椎概念和命名的再认识
- 淀粉与变性淀粉知识
- 华为信息安全宣传
- 物业管理供方管理程序
- GB/T 37642-2019聚己内酯(PCL)
- GB/T 3730.2-1996道路车辆质量词汇和代码
- GB 25585-2010食品安全国家标准食品添加剂氯化钾
- 设计文件审核记录表(模本)
评论
0/150
提交评论