Java IO学习【9】模拟一个Buffer-MyBufferedReader
2015-07-26 08:41
465 查看
俺在第【7】中已经简单说明了readLine的原理,在此基础上可以写一个自己的缓冲区,就叫MyBufferedReader,没啥创意,但很实用的名字。如果将来给我孩子起名字也起一个实用的名字~哈哈~,晚上好好了玩耍了一伙儿,感觉没有以前那么累了,所以确实得劳逸结合的来。
回想BufferedReader,可以推出在MyBufferedReader中应该最少有两个函数,一个是按字符读取的方式就叫做myRead();另一个是按行读取方式就是myReadLine();现在各自来说他们的编码方案。
(1)myRead();这个是每次读取一个字符,所以用底层方式将数据读到buf中后,在从buf中取出一个字符即可,这步需要一个int pos来记录buf的当前位置;当将buf中的数据读完后需要重新利用底层函数进行读取,这步需要一个count来记录是否已将buf读完,同时将pos置0因为需要从buf的首部开始读取;所以代码如下:
这个编码就完成了。
(2)关于myReadLine这个是按行读取字符的,对于StringBuilder不是很了解,以后学习。
回想BufferedReader,可以推出在MyBufferedReader中应该最少有两个函数,一个是按字符读取的方式就叫做myRead();另一个是按行读取方式就是myReadLine();现在各自来说他们的编码方案。
(1)myRead();这个是每次读取一个字符,所以用底层方式将数据读到buf中后,在从buf中取出一个字符即可,这步需要一个int pos来记录buf的当前位置;当将buf中的数据读完后需要重新利用底层函数进行读取,这步需要一个count来记录是否已将buf读完,同时将pos置0因为需要从buf的首部开始读取;所以代码如下:
public int myRead() throws IOException{ //1.从源中获取一批数据到缓冲区中,需要先做判断, //只有计数器为0时表示已从缓冲区中读完,需要从源中获取数据 if(count==0){ count = r.read(buf); //每次获取数据到缓冲区后(即上一次的缓冲区数据已经读完),从缓冲区头部开始读取数据 pos = 0; } if(count==-1) //表示已经文件读完。 return -1; char ch = buf[pos++]; count--; return ch; }
这个编码就完成了。
(2)关于myReadLine这个是按行读取字符的,对于StringBuilder不是很了解,以后学习。
public String myReadLine() throws IOException{ StringBuilder sb = new StringBuilder(); int ch = 0; while((ch=myRead())!=-1){ if(ch=='\r') //如果读到换行 continue; if(ch=='\n') //如果已经读到头 return sb.toString(); //将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中 sb.append((char)ch); } if(sb.length()!=0) return sb.toString(); //若最后一行没有回车,用这个语句可以读到最后一行 return null; }
相关文章推荐
- ImageEffects
- jQuery、Ajax分页
- Scala并发编程react、loop代码实战
- html的文本元素总结
- html5中多媒体的应用
- Bootstrap全局CSS样式之表格
- tsd-提升IDE对JavaScript智能感知的能力
- 15年7月学习笔记_bootstrap和js
- angularjs——工具方法
- html网页的兼容性和css优先级
- 王家林系列之scala--第69讲:Scala并发编程react、loop代码实战详解
- grunt搭建前端自动化实践
- 使用js开发列表的拖拽排序
- js与jquery常用数组方法总结
- Bootstrap全局CSS样式之表格
- HTML案例练习一
- 18种CSS3loading效果完整版,兼容各大主流浏览器,提供在线小工具使用
- jQuery 2 Option Prop Filtering
- Nodejs总结
- JS 父窗口向子窗口传值问题(window.open())