java (15)BufferedReader

                                       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();
}

-------------------------------------------------------------------------------------------------

参考:https://blog.csdn.net/scbiaosdo/article/details/80423789

https://blog.csdn.net/double_name/article/details/51193667

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值