黑马程序员技术交流社区

标题: 请教:关于使用FileReader(用到了char数组) 和BufferedReader的区别 [打印本页]

作者: 蔡增辉    时间: 2013-5-20 20:05
标题: 请教:关于使用FileReader(用到了char数组) 和BufferedReader的区别
本帖最后由 蔡增辉 于 2013-5-20 20:52 编辑

请教大家:
如果使用FileReader读取文件,程序中创建了一个字符数组做缓冲,
这样的话和使用BufferedReader 有什么区别?
FileReader读取文件的代码如下,BufferedReader的就不写了。
补充问题:这样使用FileReader和使用BufferedReader,效率上差别在哪里?

1.PNG (19.68 KB, 下载次数: 0)

1.PNG

作者: FantasticPie    时间: 2013-5-20 20:18
其实从代码中就不难看出,使用FileReader读取的时候用while循环语句把字符一个一个的读进字符数组,而BufferedReader是用缓冲方式,直接用readLine读取一行!
作者: 炉海佳    时间: 2013-5-20 20:24
BufferedReader里面的原理和你写的差不多,肯定封装了数组,不过BufferedReader有读一行的方法,还有一个newLine换行方法,这个换行是不分系统的 这两个方法在开发用起来不是很爽,自己搞个数组不麻烦??
老毕说的java提供了方法我们就用,没有我们再造一个,有就可尽用吧!!
作者: 蔡增辉    时间: 2013-5-20 20:50
FantasticPie 发表于 2013-5-20 20:18
其实从代码中就不难看出,使用FileReader读取的时候用while循环语句把字符一个一个的读进字符数组,而Buffe ...

BufferedReader在用readLine读取一行之前,应该已经经历了使用FileReader用while循环语句把字符一个一个的读进字符数组,
作者: FantasticPie    时间: 2013-5-20 21:44
蔡增辉 发表于 2013-5-20 20:50
BufferedReader在用readLine读取一行之前,应该已经经历了使用FileReader用while循环语句把字符一个一个 ...

刚才查看了一下源代码发现,readLine()的内部不是使用读取字符的形式读取的,而是使用StringBuffer字符串缓冲append()方法实现的。
String readLine(boolean ignoreLF) throws IOException {
        StringBuffer s = null;
        int startChar;

        synchronized (lock) {
            ensureOpen();
            boolean omitLF = ignoreLF || skipLF;

        bufferLoop:
            for (;;) {

                if (nextChar >= nChars)
                    fill();
                if (nextChar >= nChars) { /* EOF */
                    if (s != null && s.length() > 0)
                        return s.toString();
                    else
                        return null;
                }
                boolean eol = false;
                char c = 0;
                int i;

                /* Skip a leftover '\n', if necessary */
                if (omitLF && (cb[nextChar] == '\n'))
                    nextChar++;
                skipLF = false;
                omitLF = false;

            charLoop:
                for (i = nextChar; i < nChars; i++) {
                    c = cb;
                    if ((c == '\n') || (c == '\r')) {
                        eol = true;
                        break charLoop;
                    }
                }

                startChar = nextChar;
                nextChar = i;

                if (eol) {
                    String str;
                    if (s == null) {
                        str = new String(cb, startChar, i - startChar);
                    } else {
                        s.append(cb, startChar, i - startChar);
                        str = s.toString();
                    }
                    nextChar++;
                    if (c == '\r') {
                        skipLF = true;
                    }
                    return str;
                }

                if (s == null)
                   s = new StringBuffer(defaultExpectedLineLength);
                s.append(cb, startChar, i - startChar);
            }
        }
    }





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2