前言
Github:https://github.com/yihonglei/jdk-source-code-reading(java-io)
一 BufferedReader 概述
BufferedReader是缓冲字符输入流,它继承于Reader。
BufferedReader的作用是为其他字符输入流添加一些缓冲功能。创建BufferedReader时,我们会通过它的构造函数指定某个Reader为参数。
BufferedReader会将该Reader中的数据分批读取,每次读取一部分到缓冲中,操作完缓冲中的这部分数据之后,再从Reader中读取下一部分的数据,
当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。
如果缓冲区数据不足,才会再从文件中读取。为什么需要缓冲呢?
缓冲中的数据实际上是保存在内存中,而原始数据可能是保存在硬盘或NandFlash中;而我们知道,从内存中读取数据的速度比从硬盘
读取数据的速度至少快10倍以上。为什么不一次性将全部数据都读取到缓冲中呢?
第一,读取全部的数据所需要的时间可能会很长。
第二,内存价格很贵,容量不像硬盘那么大。
从字符输入流读取文本,缓冲字符,以便有效地读取字符、数组和行。
可以指定缓冲区大小,也可以使用默认大小。默认值足够大,大多数情况下均能支持。
一般来说,读取器读取的每个请求都会引起相应的读请求,由底层字符或字节流构成。
例如:
BufferedReader = new BufferedReade(FileReader("foo"));
如果从指定文件缓冲输入,每次调用read()或readline()可能导致数据被从文件读取,转换成文字,然后返回,
这样做效率非常低,因为会多次与硬盘交互。BufferedReader 则比较高效,相对于一个字符/字节地读取、转换、返回来说,
它有一个缓冲区,读满缓冲区才返回;一般情况下,都建议使用它们把其它Reader/InputStream包起来,
使得读取数据更高效。
二 BufferedReader 构造器和方法分析
构造器
public BufferedReader(Reader in);
根据Reader创建BufferedReader使用默认大小的输入缓冲区的缓冲字符输入流。
public BufferedReader(Reader in, int sz);
创建一个缓冲字符输入流,该输入流使用指定大小的输入缓冲区。
重要方法
void close();
关闭缓冲输入流。
Stream<String> lines();
从BufferedReader中读取字符流以线性元素返回。
void mark(int readAheadLimit);
标记当前流读取的位置。
boolean markSupported();
判断是否支持mark操作
int read();
读取一个字符。
int read(char[] cbuf, int off, int len);
读取指定长度的字符。
String readLine();
读取下一个元素。
boolean ready();
是否为只读。
void reset();
重置文件读取位置。
long skip(long n);
跳过多少个字符位置。
三 BufferedReader 实例
package com.jpeony.io.readerwriter;
import java.io.*;
/**
* @author yihonglei
*/
public class BufferedReaderSimple {
public static void main(String[] args) {
// 指定构建文件
File file = new File("C:\\mycode\\hello.txt");
// 创建字符输入流
try (FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader)) {
// 自定义字符数组
char[] data = new char[1024];
// 读取文件
br.read(data);
// 输出文件内容
System.out.println("文件内容;" + new String(data));
} catch (IOException e) {
e.printStackTrace();
}
}
}