文章目录
-
- 1. 概念
- 2. 字段
-
- 1. BufferedWriter
- 2. BufferedReader
- 3. 方法
-
- 1. 构造器
-
- 1. BufferedWriter
- 2. BufferedReader
- 2. 其他方法
-
- 1. BufferedWriter
- 2. BufferedReader
- 4. 案例
1. 概念
BufferedWriter和BufferedReader分别是字符缓冲输出流和字符缓冲输入流,为底层字符流提供了缓冲的功能,底层字符流读取字符或者写入字符时,会频繁与硬盘进行交互,导致读取效率很低.缓冲流的作用就是硬盘中的数据读取到内存,再从内存中一次性读取多个数据.提高了读取的速度.根据jdk的api文档介绍,缓冲流的推荐使用方式.
- BufferedReader用来包装开销比较高的底层字符流(如FileReader或者是InputStreamReader).底层字符流每次调用read()或者readLine()都是先从文件中读取字节,然后转化成字符返回,造成读取效率低.使用缓冲流包装例如BufferedReader in = new BufferedReader(new FileReader(“foo.txt”));将会提升读取读取的速度.
- BufferedWriter()同样是用于包装开销比较高的底层字符输出流(FileWriter或者是InputStreamWriter).例如BufferedWriter out=new BufferedWriter(new FileWriter(“foo.txt”)).相比于底层字符流写到文件速度有很大提升.
2. 字段
1. BufferedWriter
- private Writer out:表示的是底层字符输出流
- private char cb[]:缓冲字符输出流中缓冲区
- private int nChars,:缓冲区大小
- private int nextChar:缓冲区中下一个读取字符的索引
- private static int defaultCharBufferSize = 8192:创建的默认缓冲区的大小为8192个字符
- private String lineSeparator:换行符,会在创建缓冲字符输出流时进行赋值
2. BufferedReader
- private Reader in:底层字符输入流
- private char cb[]:字符缓冲输入流中缓冲区
- private int nChars, nextChar:缓冲区中有效字符数
- private int nextChar:缓冲区中读取下一个字符的索引位置
- private static final int INVALIDATED = -2:用于表示缓冲区中标记失效
- private static final int UNMARKED = -1:缓冲区中标记位置初始化为-1,表示的是没有标记
- private int markedChar = UNMARKED:表示的是标记位置,此值会保存调用mark()时缓冲区中当前读取字符位置
- private int readAheadLimit = 0:用于标记之后,在标记任然有效的情况下,可读取字符的最大值,超过此值,标记将会失效
- private boolean skipLF = false:是否跳过换行符
- private boolean markedSkipLF = false:标记情况下,是否跳过换行符
- private static int defaultCharBufferSize = 8192:字符缓冲输入流中缓冲区的大小为8192个字符
- private static int defaultExpectedLineLength = 80:默认一行的字符数为80个字符
3. 方法
1. 构造器
1. BufferedWriter
- public BufferedWriter(Writer out):创建一个指定了底层字符输出流,缓冲区的大小为默认的8192个字符的缓冲字符输出流
- public BufferedWriter(Writer out, int sz):创建一个指定了底层字符输出流,缓冲区大小为sz个字符的缓冲字符输出流
2. BufferedReader
- public BufferedReader(Reader in, int sz):创建一个指定了底层字符输入流,和缓冲区大小为sz的字符缓冲输入流
- public BufferedReader(Reader in):创建一个指定了底层字符输入流,缓冲区大小为默认的8192个字符的字符缓冲输入流
2. 其他方法
1. BufferedWriter
- private void ensureOpen():确保底层字符输出流没有关闭
- public void write(int c):将一个字符写到字符缓冲输出流中
- public void write(char cbuf[], int off, int len):将字符数组cbuf中off位置开始,len个字符写到缓冲区中
- public void write(String s, int off, int len):将字符串s中off位置开始,len个字符写到缓冲区中
- public void newLine():将一个换行符写到字符缓冲输出流中.(每个平台的换行符是不一样)
- public void flush():刷新缓冲区,将缓冲区数据写出
- public void close():关闭流,释放相关资源
2. BufferedReader
- private void ensureOpen():确保底层字符输入流没有关闭
- private void fill():填充方法,缓冲区没有可读取数据时会调用此方法,从底层字符输入流中读取数据填充到缓冲区,根据缓冲区是否存在标记,填充对应的区域
- public int read():从缓冲区读取一个字符
- public int read(char cbuf[], int off, int len):从缓冲区中读取len个字符到字符数组cbuf中,位置从off开始
- public String readLine():从缓冲区中读取一行数据.传入是否忽略换行符
- public long skip(long n):跳过n个字符
- public boolean ready():此流是否准备读取
- public boolean markSupported():缓冲区是否支持标记
- public void mark(int readAheadLimit):标记当前位置.调用reset()方法时会将当前位置重置到标记的位置
- public void reset():调用此方法,会将当前位置重置到最后一次调用mark()标记的位置
- public void close():关闭流,释放相关资源
- public Stream lines():jdk1.8中新添加的方法,按照系统换行符,迭代每一个行的内容.得到是缓冲区中所有的字符的流
4. 案例
public class BufferedDemo {
public static void main(String[] args) throws IOException {
testBufferedWriter();testBufferedReader();}//a test of BufferedWriterprivate static void testBufferedWriter() throws IOException{
char[] cbuf = new char[] {
'h','e','l','l','o','w','o','r','l','d'};BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java.txt"));bw.write("1234567890");bw.write(cbuf, 0, 8);bw.write('z');bw.newLine(); //调用newline相当于write('\n')('\n'是系统换行符)bw.write("bufferedDemo", 2, 5);bw.close();}//a test of BufferedReaderprivate static void testBufferedReader() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\java.txt"));int read = br.read();System.out.println("单个字符------"+(char)read);char[] cbuf = new char[1024];br.read(cbuf, 0, 10);System.out.println("字符数组----------"+new String(cbuf));if(br.markSupported()) {
br.mark(100);}String readLine = br.readLine(); //调用readLine()读取的是下一个读取字符位置到换行符之前所有的字符.System.out.println("读取一行-----------"+readLine);br.reset();System.out.println("调用reset()方法-------------"+(char)br.read());br.skip(5);System.out.println("跳过5个字符位置-------------"+(char)br.read());br.close();}
}
//testBufferedWriter运行结果:
1234567890helloworz
ffere//testBufferedReader运行结果:
单个字符------1
字符数组----------234567890h读取一行-----------elloworz
调用reset()方法-------------e
跳过5个字符位置-------------r