BufferedReader类
目录:
1. 介绍bufferedReader类
1.1 作用
1.2 工作方式
1.3 为什么需要缓冲呢?
2. Reader类
2.1 介绍
2.2 InputStream和Reader的联系与区别
3. 构造方法
4. 常用方法
5. 代码演示
1. 介绍bufferedReader类
1.1 作用
要想读懂BufferReader的源码,就要先理解它的思想。BufferReader的作用是为其它Reader提供缓冲功能。
1.2 工作方式
创建 BufferReader时,我们会通过它的构造函数指定某个Reader为参数。(一会介绍他的构造函数)BufferReader会将该Reader中的数据分批读取,每次读取一部分到缓冲中;操作完缓冲中的这部分数据之后,再从Reader中读取下一部分的数据。
1.3 为什么需要缓冲呢?
原因很简单,效率问题!缓冲中的数据实际上是保存在内存中,而原始数据可能是保存在硬盘或NandFlash中;而我们知道,从内存中读取数据的速度比从硬盘读取数据的速度至少快10倍以上。
那干嘛不干脆一次性将全部数据都读取到缓冲中呢?第一,读取全部的数据所需要的时间可能会很长。第二,内存价格很贵,容量不想硬盘那么大。
--------------------------------------------------------------------------------------------------
2. Reader类
刚刚上面提到了Reader类,如果明白该类的朋友就不需要阅读了。
2.1 介绍
说到Reader类,我们还需要提一下InputStream类。
java.io下面有两个抽象类:InputStream和Reader
InputStream是表示字节输入流的所有类的超类; Reader是用于读取字符流的抽象类InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。
即用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
InputStream
| __FileInputStream
Reader
|——BufferedReader
|___InputStreamReader
|__FileReader
--------------------------------------------------------------------------------------------------
2.2 InputStream和Reader的联系与区别
(1)字符与字节:
FileInputStream 类以二进制输入/输出,I/O速度快且效率高,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读,而且无法直接对文件中的字符进行操作,比如替换,查找(必须以字节形式操作);
而Reader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循环来读取文件;可以使用BufferedReader的readLine()方法一行一行的读取文本。
(2)编码
InputStreamReader ,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。
FileReader与InputStreamReader 涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而FileInputStream 以二进制方式处理,不会出现乱码现象.
因此要指定编码方式时,必须使用InputStreamReader 类,所以说它是字节转换为字符的桥梁;
(3)缓存区
BufferReader类用来包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和InputStreamReader)。
(4)规范用法
总结以上内容,得出比较好的规范用法:
1) File file = new File ("hello.txt");
FileInputStream in=new FileInputStream (file);
2) File file = new File ("hello.txt");
FileInputStream in=new FileInputStream (file);
InputStreamReader inReader=new InputStreamReader (in,"UTF-8");
BufferedReader bufReader=new BufferedReader(inReader);
3) File file = new File ("hello.txt");
FileReader fileReader=new FileReader(file);
BufferedReader bufReader=new BufferedReader(fileReader);
参考:java中Reader类和InputStream类的区别
-------------------------------------------------------------------------------------------------
3. 构造方法
public BufferedReader(Reader in,int sz)
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
in - 一个 Reader
sz - 输入缓冲区的大小
public BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
-------------------------------------------------------------------------------------------------
4. 常用方法
public int read() throws IOException
读取单个字符。
作为一个整数(其范围从 0 到 65535 (0x00-0xffff))读入的字符,如果已到达流末尾,则返回 -1
public int read(char[] cbuf) throws IOException
一次读取一个字节数组
cbuf - 目标缓冲区
读取的字符数,如果已到达流的末尾,则返回 -1
public void close() throws IOException
关闭该流并释放与之关联的所有资源。
public String readLine() throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
-------------------------------------------------------------------------------------------------
5. 代码演示
public static void main(String[] args) throws Exception {
//创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("bw.txt"));
//读数据
//一次读取一个字符数组
char[] chs = new char[1024] ;
int len = 0 ;
while((len=br.read(chs))!=-1) {
System.out.println(new String(chs,0,len));
}
//释放资源
br.close();
}
-------------------------------------------------------------------------------------------------