您的位置:首页 > Web前端

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的首部开始读取;所以代码如下:

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;
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: