学无先后,达者为师

网站首页 编程语言 正文

自定义类模拟BufferedReader的readLine()功能

作者:饭饭m 更新时间: 2024-02-28 编程语言
  • 在这里插入代码片我要返回一个字符串,怎么办?我们必须去看看r对象能够读取什么?两种读取方法,一次读取一个字符或一次读取一个字符数组。那么,我们要返回一个字符串吗,用哪个方法比较好呢?我们很容易想到字符数组比较好,但是问题来了,就是这个字符数组的长度是多长呢?
  • 根本就没有办法定义数组的长度,你定义多长都不合适。所以只能选择一次读取一个字符。但是呢,使用这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了。所以,我们又应该定义一个临时存储空间把读过的字符给存储起来。
  • 这个用谁比较合适呢?数组、集合、字符串缓冲区三个可供选择。
  • 经过分析,最终选择字符串缓冲区对象。并且使用的是StringBuilder。
测试
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.println(line);
        }

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

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

    /**
     * 写一个方法,返回值是一个字符串。
     */

    public String readLine() throws IOException {
        StringBuilder sb = new StringBuilder();

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

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

原文链接:https://blog.csdn.net/qq_41834086/article/details/107631410

  • 上一篇:没有了
  • 下一篇:没有了
栏目分类
最近更新