当前位置: 代码迷 >> 综合 >> Java IO (12) -- BufferedWriter 类 BufferedReader 类
  详细解决方案

Java IO (12) -- BufferedWriter 类 BufferedReader 类

热度:30   发布时间:2023-12-16 13:25:40.0

文章目录

    • 1. 概念
    • 2. 字段
      • 1. BufferedWriter
      • 2. BufferedReader
    • 3. 方法
      • 1. 构造器
        • 1. BufferedWriter
        • 2. BufferedReader
      • 2. 其他方法
        • 1. BufferedWriter
        • 2. BufferedReader
    • 4. 案例

1. 概念

BufferedWriter和BufferedReader分别是字符缓冲输出流和字符缓冲输入流,为底层字符流提供了缓冲的功能,底层字符流读取字符或者写入字符时,会频繁与硬盘进行交互,导致读取效率很低.缓冲流的作用就是硬盘中的数据读取到内存,再从内存中一次性读取多个数据.提高了读取的速度.根据jdk的api文档介绍,缓冲流的推荐使用方式.

  1. BufferedReader用来包装开销比较高的底层字符流(如FileReader或者是InputStreamReader).底层字符流每次调用read()或者readLine()都是先从文件中读取字节,然后转化成字符返回,造成读取效率低.使用缓冲流包装例如BufferedReader in = new BufferedReader(new FileReader(“foo.txt”));将会提升读取读取的速度.
  2. BufferedWriter()同样是用于包装开销比较高的底层字符输出流(FileWriter或者是InputStreamWriter).例如BufferedWriter out=new BufferedWriter(new FileWriter(“foo.txt”)).相比于底层字符流写到文件速度有很大提升.

2. 字段

1. BufferedWriter

  1. private Writer out:表示的是底层字符输出流
  2. private char cb[]:缓冲字符输出流中缓冲区
  3. private int nChars,:缓冲区大小
  4. private int nextChar:缓冲区中下一个读取字符的索引
  5. private static int defaultCharBufferSize = 8192:创建的默认缓冲区的大小为8192个字符
  6. private String lineSeparator:换行符,会在创建缓冲字符输出流时进行赋值

2. BufferedReader

  1. private Reader in:底层字符输入流
  2. private char cb[]:字符缓冲输入流中缓冲区
  3. private int nChars, nextChar:缓冲区中有效字符数
  4. private int nextChar:缓冲区中读取下一个字符的索引位置
  5. private static final int INVALIDATED = -2:用于表示缓冲区中标记失效
  6. private static final int UNMARKED = -1:缓冲区中标记位置初始化为-1,表示的是没有标记
  7. private int markedChar = UNMARKED:表示的是标记位置,此值会保存调用mark()时缓冲区中当前读取字符位置
  8. private int readAheadLimit = 0:用于标记之后,在标记任然有效的情况下,可读取字符的最大值,超过此值,标记将会失效
  9. private boolean skipLF = false:是否跳过换行符
  10. private boolean markedSkipLF = false:标记情况下,是否跳过换行符
  11. private static int defaultCharBufferSize = 8192:字符缓冲输入流中缓冲区的大小为8192个字符
  12. private static int defaultExpectedLineLength = 80:默认一行的字符数为80个字符

3. 方法

1. 构造器

1. BufferedWriter

  1. public BufferedWriter(Writer out):创建一个指定了底层字符输出流,缓冲区的大小为默认的8192个字符的缓冲字符输出流
  2. public BufferedWriter(Writer out, int sz):创建一个指定了底层字符输出流,缓冲区大小为sz个字符的缓冲字符输出流

2. BufferedReader

  1. public BufferedReader(Reader in, int sz):创建一个指定了底层字符输入流,和缓冲区大小为sz的字符缓冲输入流
  2. public BufferedReader(Reader in):创建一个指定了底层字符输入流,缓冲区大小为默认的8192个字符的字符缓冲输入流

2. 其他方法

1. BufferedWriter

  1. private void ensureOpen():确保底层字符输出流没有关闭
  2. public void write(int c):将一个字符写到字符缓冲输出流中
  3. public void write(char cbuf[], int off, int len):将字符数组cbuf中off位置开始,len个字符写到缓冲区中
  4. public void write(String s, int off, int len):将字符串s中off位置开始,len个字符写到缓冲区中
  5. public void newLine():将一个换行符写到字符缓冲输出流中.(每个平台的换行符是不一样)
  6. public void flush():刷新缓冲区,将缓冲区数据写出
  7. public void close():关闭流,释放相关资源

2. BufferedReader

  1. private void ensureOpen():确保底层字符输入流没有关闭
  2. private void fill():填充方法,缓冲区没有可读取数据时会调用此方法,从底层字符输入流中读取数据填充到缓冲区,根据缓冲区是否存在标记,填充对应的区域
  3. public int read():从缓冲区读取一个字符
  4. public int read(char cbuf[], int off, int len):从缓冲区中读取len个字符到字符数组cbuf中,位置从off开始
  5. public String readLine():从缓冲区中读取一行数据.传入是否忽略换行符
  6. public long skip(long n):跳过n个字符
  7. public boolean ready():此流是否准备读取
  8. public boolean markSupported():缓冲区是否支持标记
  9. public void mark(int readAheadLimit):标记当前位置.调用reset()方法时会将当前位置重置到标记的位置
  10. public void reset():调用此方法,会将当前位置重置到最后一次调用mark()标记的位置
  11. public void close():关闭流,释放相关资源
  12. 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
  相关解决方案