Java IO学习【9】模拟一个Buffer-MyBufferedReader

来源:互联网 发布:网络加速器哪个好用 编辑:程序博客网 时间:2024/06/05 06:37

       俺在第【7】中已经简单说明了readLine的原理,在此基础上可以写一个自己的缓冲区,就叫MyBufferedReader,没啥创意,但很实用的名字。如果将来给我孩子起名字也起一个实用的名字~哈哈~,晚上好好了玩耍了一伙儿,感觉没有以前那么累了,所以确实得劳逸结合的来。

      回想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;}



 

0 0
原创粉丝点击