IO流_自定义类模拟BufferedReader的readLine()功能案例

101 篇文章 0 订阅
85 篇文章 0 订阅
package cn.itcast_08;

import java.io.IOException;
import java.io.Reader;

/*
 * 用Reader模拟BufferedReader()的readLine()功能
 * 
 * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符
 */
public class MyBufferedReader {
	private Reader r;

	public MyBufferedReader(Reader r) {
		this.r = r;
	}

	/*
	 * 思考:写一个方法,返回值是一个字符串。
	 */
	public String readLine() throws IOException {
		/*
		 * 我要返回一个字符串,我该怎么办呢?
		 * 我们必须去看看r对象能读取什么东西呢?
		 * 两个读取方法,一次读取一个字符或者一次读取一个字符数组
		 * 那么,我们要返回一个字符串,用那个方法比较好呢?
		 * 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢?
		 * 根本就没有办法定义数组的长度,你定义多长都不合适。
		 * 所以,只能选择一次读取一个字符。
		 * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了。
		 * 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。
		 * 这个用谁比较合适呢?数组、集合、字符串缓冲区三个可供选择。
		 * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder
		 */
		StringBuilder sb = new StringBuilder();

		// 做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1
		/*
		 * hello
		 * world
		 * java
		 * 
		 * 104101108108111
		 * 119111114108100
		 * 1069711897
		 */
		int ch = 0;
		while ((ch = r.read()) != -1) {//104,101,108,108,111
		// if (ch == '\r') {
		// continue;
		// }
			
			if(ch == '\n'){
				return sb.toString();//hello
			}else{
				 sb.append((char)ch);//hello
			}
			
			//为了防止数据丢失,判断sb的长度不能大于0
			if(sb.length() > 0){
				return sb.toString();
			}
		}
		return null;
	}

	/*
	 * 先写一个关闭方法
	 */
	public void close() throws IOException {
		this.r.close();
	}
}


package cn.itcast_08;

import java.io.FileReader;
import java.io.IOException;

/*
 * 测试MyBufferedReader的时候,把它当作BufferedReader一样的使用
 */
public class MyBufferedReaderDemo {
	public static void main(String[] args) throws IOException {
		MyBufferedReader mbr = new MyBufferedReader(new FileReader("my.txt"));

		String line = null;
		while ((line = mbr.readLine()) != null) {
			System.out.print(line);
		}

		mbr.close();

		// System.out.println('\r' + 0);// 13
		// System.out.println('\n' + 0);// 10
	}
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值