我记得很久以前写过一个内部使用Byte数组的BufferedStreamReader,实测效率比原本使用Char数组的要快,不过这只是在32位系统下测试的。写这个StreamReader是为了修正文件上传组件里原本的效率问题。
实际上BufferedReader和StreamReader(例如FileReader就是一个StreamReader)的用途是不同的,流(Stream)数据就应该用byte数组以取得最大效率。而BufferedReader的作用并不是读取一堆流式数据,而是针对带有换行符的文本内容的按行读取,同时要正确处理各种字符集的文本数据。
明白BufferedReader的真正用途就很容易理解,为何内部使用Char数组,因为Java的字符和字符串都是双字节的,以解决多种字符集的问题。
BufferedReader一般创建时需要一个StreamReader的参数,由StreamReader去用流的方式读取数据。而BufferedReader只是解析流数据并组成一行一行的String。
因此,BufferedReader的Buffer也是具有非常重要的用途,按字符集解析流数据,组成Char数组,这个过程一定是需要预读取的。然后才是基于Buffer,辨析Windows和Linux不同换行符\n\r,解析出一行String返回。
用了Buffer当然还是需要从Byte到Char的转换,只不过比之不用Buffer,效率会有数量级的提高。