Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例

1. 用Reader模拟BufferedReader的readLine()功能:

  readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符

2. 代码实现和思路分析:

 1 package cn.itcast_08;
 2 
 3 import java.io.IOException;
 4 import java.io.Reader;
 5 
 6 /*
 7  * 用Reader模拟BufferedReader的readLine()功能
 8  * 
 9  * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符
10  */
11 public class MyBufferedReader {
12     private Reader r;
13 
14     public MyBufferedReader(Reader r) {
15         this.r = r;
16     }
17 
18     /*
19      * 思考:写一个方法,返回值是一个字符串。
20      */
21     public String readLine() throws IOException {
22         /*
23          * 我要返回一个字符串,我该怎么办呢? 我们必须去看看r对象能够读取什么东西呢? 两个读取方法,一次读取一个字符或者一次读取一个字符数组
24          * 那么,我们要返回一个字符串,用哪个方法比较好呢? 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢?
25          * 根本就没有办法定义数组的长度,你定义多长都不合适。 所以,只能选择一次读取一个字符。
26          * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。
27          * 这个用谁比较和是呢?数组,集合,字符串缓冲区三个可供选择。
28          * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder
29          */
30         StringBuilder sb = new StringBuilder();
31 
32         // 做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1
33         
34         
35         /*
36         hello
37         world
38         java    
39         
40         104101108108111
41         119111114108100
42         1069711897
43          */
44         
45         int ch = 0;
46         while ((ch = r.read()) != -1) { //104,101,108,108,111
47             if (ch == '
') {
48                 continue;
49             }
50 
51             if (ch == '
') {
52                 return sb.toString(); //hello
53             } else {
54                 sb.append((char)ch); //hello
55             }
56         }
57 
58         // 为了防止数据丢失,判断sb的长度不能大于0 (保证最后一个数据没有回车换行也不会丢失)
59         if (sb.length() > 0) {
60             return sb.toString();
61         }
62 
63         return null;
64     }
65 
66     /*
67      * 先写一个关闭方法
68      */
69     public void close() throws IOException {
70         this.r.close();
71     }
72 }

运行效果,如下:

原文地址:https://www.cnblogs.com/hebao0514/p/4870759.html