【IO】BufferedReader 旧城等待, 2022-05-31 08:18 178阅读 0赞 # 前言 # Github:[https://github.com/yihonglei/jdk-source-code-reading][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(); } } } [https_github.com_yihonglei_jdk-source-code-reading]: https://github.com/yihonglei/jdk-source-code-reading
还没有评论,来说两句吧...