BufferedReader 终极解析与记忆指南

BufferedReader 终极解析与记忆指南

一、核心本质

BufferedReader 是 Java 提供的缓冲字符输入流,继承自 Reader,通过内存缓冲和行读取功能极大提升文本读取效率。

核心特性速查表

特性说明
继承链Reader → BufferedReader
缓冲机制默认 8KB 字符缓冲区(可自定义大小)
核心优势提供 readLine() 方法,支持按行读取文本
性能提升减少物理 I/O 操作次数
线程安全

二、构造方法

java

// 1. 基础构造(默认8KB缓冲区)
BufferedReader br = new BufferedReader(Reader in);// 2. 自定义缓冲区大小
BufferedReader br = new BufferedReader(Reader in, int size);

典型初始化方式

java

// 文件读取标准写法
BufferedReader br = new BufferedReader(new FileReader("text.txt")); // 指定编码读取(避免乱码)
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("text.txt"), StandardCharsets.UTF_8));

三、核心方法

方法作用
String readLine()读取一行文本(不包含换行符)(通俗的讲就是,一读,读一行),返回null表示EOF        该方法每次读取一行,如果读取不到任何数据,则返回null,不是返回-1了(注意区别)
int read()读取单个字符
int read(char[] cbuf)读取字符到数组
long skip(long n)跳过n个字符
void close()关闭流
Stream<String> lines()(Java 8+) 返回文本行的Stream
void   mark(int readAheadLimit)在当前位置上打标记(有的流支持打标记,有的流不支持)
void   reset()回到上一次打标记的位置
一般mark方法和reset方法组合使用,先调用mark(),再调用reset(),这两个方法组合起来完成的任务是:某段内容重复读取

四、工作原理图解

mermaid

sequenceDiagramparticipant Programparticipant BufferedReaderparticipant ActualReaderProgram->>BufferedReader: readLine()alt 缓冲区有未读数据BufferedReader-->>Program: 直接返回一行文本else 需要填充缓冲区BufferedReader->>ActualReader: 批量读取8KB数据ActualReader-->>BufferedReader: 原始数据BufferedReader->>BufferedReader: 解码并缓冲数据BufferedReader-->>Program: 返回首行文本end

五、实战代码模板

1. 基础按行读取

java

try (BufferedReader br = new BufferedReader(new FileReader("log.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
}

2. Java 8+ 流式处理

java

try (BufferedReader br = Files.newBufferedReader(Paths.get("data.txt"))) {br.lines().filter(l -> l.contains("error")).forEach(System.out::println);
}

3. 读取到字符数组

java

char[] buffer = new char[1024];
try (BufferedReader br = ...) {int charsRead;while ((charsRead = br.read(buffer)) != -1) {String chunk = new String(buffer, 0, charsRead);// 处理片段...}
}

六、性能对比数据

操作直接读取 (FileReader)缓冲读取 (BufferedReader)
读取10万行日志文件~1200ms~150ms (提升8倍)
搜索大文本文件~3000ms~400ms (提升7.5倍)

七、记忆心法

1. 三字经记忆法

"包一层,读一行,快如风"

  • :包装其他Reader

  • 读一行:核心是 readLine()

  • :缓冲机制加速

2. 对比记忆表

对比维度BufferedReaderFileReader
读取方式支持按行读取只能按字符/数组读取
缓冲机制有(默认8KB)
典型用途日志分析、配置文件读取低层字符操作

3. 场景联想

想象读书:

  • 无缓冲:每次从书架上拿一页看(效率低)

  • 有缓冲:一次拿一章放在手边随时翻阅(高效)


八、高频面试题

1. readLine() 会包含换行符吗?

  • 不包含!返回的字符串去掉了 \n 或 \r\n

2. 如何处理大文本文件?

java

// 方案1:传统逐行处理
try (BufferedReader br = ...) {String line;while ((line = br.readLine()) != null) {// 处理行...}
}// 方案2:Java 8 Stream API
br.lines().parallel().forEach(...);  // 并行处理

3. 为什么读取中文乱码?如何解决?

  • 原因:未正确指定编码(FileReader 用系统默认编码)

  • 解决

    java

new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"));

4. 缓冲区默认大小?如何调优?

  • 默认8192字符(16KB内存)

  • 大文件可增大缓冲区:

    java

new BufferedReader(reader, 32768);  // 32KB缓冲区

九、终极总结

mermaid

pietitle BufferedReader核心价值"按行读取" : 40"减少I/O次数" : 35"编码处理灵活性" : 25

黄金法则

"所有文本读取操作,必须用BufferedReader包装!"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派超全系列教程文档--(26)在 Raspberry Pi 上配置热点

在 Raspberry Pi 上配置热点 在 Raspberry Pi 上配置热点启用热点禁用热点使用 Raspberry Pi 作为网桥 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 在 Raspberry Pi 上配置热点 Raspberry Pi 可以使用无线模块托管自己的无线网络。如果您通过…

[硬件]单片机下载电路讲解-以ch340为例

首先我们明确要实现的效果&#xff1a; 实现 CH340 通过 Type - C 接口下载程序到单片机 1、前置知识 首先我们要知道 ch340 和typec的作用分别是什么 CH340 作用(usb-ttl) CH340 是一种 USB 转串口芯片 。其主要作用是实现 USB 总线与异步串行接口之间的转换&#xff0c;充当 …

linux入门六:Linux Shell 编程

一、Shell 概述 1. 什么是 Shell&#xff1f; Shell 是 Linux 系统中用户与内核之间的桥梁&#xff0c;作为 命令解析器&#xff0c;它负责将用户输入的文本命令转换为计算机可执行的机器指令。 本质&#xff1a;Shell 是一个程序&#xff08;如常见的 Bash、Zsh&#xff09…

用shell脚本实现自动监控并封禁连接数超过阈值的IP

写一个 shell 脚本&#xff0c;创建脚本文件 /usr/local/bin/check_conn.sh #!/bin/bash if [[ $EUID -ne 0 ]]; thenecho "This script must be run as root." >&2exit 1 fi # 连接数阈值 THRESHOLD50# 白名单 IP&#xff08;空格分隔&#xff09; WHITELIS…

VS 中Git 中本地提交完成,没有推送,修改的内容如何还原

在 Visual Studio 中撤销本地提交但未推送的修改&#xff0c;可以通过以下方法实现&#xff1a; 一、保留修改内容&#xff08;仅撤销提交记录&#xff09; 使用 git reset --soft 在 VS 的 Git 终端中执行&#xff1a; git reset --soft HEAD~1作用&#xff1a;撤销最后一次提…

qt中的正则表达式

问题&#xff1a; 1.在文本中把dog替换成cat&#xff0c;但可能会把dog1替换成cat1&#xff0c;如果原本不想替换dog1&#xff0c;就会出现问题 2文本中想获取某种以.txt为结尾的多有文本&#xff0c;普通的不能使用 3如果需要找到在不同的系统中寻找换行符&#xff0c;可以…

Linux命令-vim编辑

用vi或vim命令进入vim编辑器。 基础: u 撤销上一次操作。x剪切当前光标所在处的字符。yy复制当前行。dd剪切当前行。p粘贴剪贴板内容到光标下方。i切换到输入模式&#xff0c;在光标当前位置开始输入文本。:wq保存并退出Vim 编辑器。:q!不保存强制退出Vim 编辑器。 拓展: w光…

VS 基于git工程编译版本自动添加版本号

目录 概要 实现方案 概要 最近在用visual Studio 开发MFC项目时&#xff0c;需要在release版本编译后的exe文件自动追加版本信息。 由于我们用的git工程管理&#xff0c;即需要基于最新的git 提交来打版本。 比如&#xff1a; MFCApplication_V1.0.2_9.exe 由于git 提交信…

nginx入门,部署静态资源,反向代理,负载均衡使用

Nginx在linux上部署静态资源 概念介绍 Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在&#xff0c;并且能够直接展示的一些文件&#xff0c;比如常见的html页面、css文件、js文件、图片、视频等资源。 相对于Tomcat&#xff0c;Nginx处理…

【字节跳动AI论文】Seaweed-7B:视频生成基础模型的高成本效益培训

摘要&#xff1a;本技术报告介绍了一种经济有效的视频生成基础模型训练策略。 我们提出了一种中等规模的研究模型&#xff0c;大约有70亿个参数&#xff08;7B&#xff09;&#xff0c;称为Seaweed-7B&#xff0c;使用665,000个H100 GPU小时从头开始训练。 尽管使用适度的计算资…

Java单例模式:实现全局唯一对象的艺术

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c…

Oracle 复制表结构(含索引、主键)操作指南

Oracle 复制表结构&#xff08;含索引、主键&#xff09;操作指南 1. 复制基础表结构 -- 创建空表结构&#xff08;不复制数据&#xff09; CREATE TABLE new_table AS SELECT * FROM old_table WHERE 10;2. 复制主键约束 -- 查询原表主键信息 SELECT constraint_name, co…

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新一个对象时&#xff0c;你需要创建一个新的对象&#xff08;或者将其拷贝一份&#xff09;…

基于 GoFrame 框架的电子邮件发送实践:优势、特色与经验分享

1. 引言 如果你是一位有1-2年Go开发经验的后端开发者&#xff0c;可能已经熟悉了Go语言在性能和并发上的天然优势&#xff0c;也曾在项目中遇到过邮件发送的需求——无论是用户注册时的激活邮件、系统异常时的通知&#xff0c;还是营销活动中的批量促销邮件&#xff0c;邮件功…

AndroidStudio编译报错 Duplicate class kotlin

具体的编译报错信息如下&#xff1a; Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21) D…

后端面试问题收集以及答案精简版

思路 不要问什么答什么 要学会扩充 比如问你go map的原理 map 是什么 数据结构&#xff0c;字典&#xff0c;k/v 结构map的应用场景有哪些 快速查找、计数器、配置管理、去重、缓存实现map有哪些限制 无序性、非线程安全的读写map的key的访问 v: mp[key] v,ok : mp[key] for…

MicroPython 开发ESP32应用教程 之 I2S、INMP441音频录制、MAX98357A音频播放、SD卡读写

本课程我们讲解Micropython for ESP32 的i2s及其应用&#xff0c;比如INMP441音频录制、MAX98357A音频播放等&#xff0c;还有SD卡的读写。 一、硬件准备 1、支持micropython的ESP32S3开发板 2、INMP441数字全向麦克风模块 3、MAX98357A音频播放模块 4、SD卡模块 5、面包板及…

UE5 物理模拟 与 触发检测

文章目录 碰撞条件开启模拟关闭模拟 多层级的MeshUE的BUG 触发触发条件 碰撞 条件 1必须有网格体组件 2网格体组件必须有网格&#xff0c;没有网格虽然可以开启物理模拟&#xff0c;但是不会有任何效果 注意开启的模拟的网格体组件会计算自己和所有子网格的mesh范围 3只有网格…

微信小程序 - swiper轮播图

官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html <swiper indicator-color"ivory" indicator-active-color"#d43c33" indicator-dots autoplay><swiper-item><image src"/images/banner…

深入探究C#官方MCP:开启AI集成新时代

一、引言 在当今数字化时代&#xff0c;.NET 开发领域不断演进&#xff0c;而 C# 官方 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的出现&#xff0c;无疑为开发者们带来了全新的机遇与挑战。随着人工智能技术的迅猛发展&#xff0c;将 AI…