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. 对比记忆表
| 对比维度 | BufferedReader | FileReader |
|---|---|---|
| 读取方式 | 支持按行读取 | 只能按字符/数组读取 |
| 缓冲机制 | 有(默认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包装!"
相关文章:
BufferedReader 终极解析与记忆指南
BufferedReader 终极解析与记忆指南 一、核心本质 BufferedReader 是 Java 提供的缓冲字符输入流,继承自 Reader,通过内存缓冲和行读取功能极大提升文本读取效率。 核心特性速查表 特性说明继承链Reader → BufferedReader缓冲机制默认 8KB 字符缓冲…...
linux-设置每次ssh登录服务器的时候提醒多久需要修改密码
在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…...
(小白0基础) 微调deepseek-8b模型参数详解以及全流程——训练篇
本篇参考bilibili如何在本地微调DeepSeek-R1-8b模型_哔哩哔哩_bilibili 上篇:(小白0基础) 租用AutoDL服务器进行deepseek-8b模型微调全流程(Xshell,XFTP) —— 准备篇 初始变量 max_seq_length 2048 dtype None load_in_4bit True单批次最大处理模型大小dy…...
调用LLM的api
目录 chatgptdemo可选模型 chatgpt demo import openai openai.api_key xxxxxxxxx # 自己的api key openai.api_base https://api.feidaapi.com/v1 # 中转非直连 # response openai.ChatCompletion.create( # model"gpt-4o", # messages[ # {"rol…...
关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析
以下是关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析: 一、汽车辅助驾驶等级详解 根据SAE(国际自动机工程师学会)的标准,自动驾驶分为 L0到L5 六个等级: 1. L0(无自动化&…...
windows安卓子系统wsa隐藏应用列表的安装激活使用
Windows 11 安卓子系统应用部署全攻略 windows安卓子系统wsa隐藏应用列表的安装激活使用|过检测核心前端 在 Windows 11 系统中,安卓子系统为用户带来了在电脑上运行安卓应用的便利。经过一系列的操作,我们已经完成了 Windows 11 安卓子系统的底层和前端…...
mongodb7日志特点介绍:日志分类、级别、关键字段(下)
#作者:任少近 上篇《mongodb7日志特点介绍:日志分类、级别、关键字段(上)》 链接: link 文章目录 4.日志会输出F/E/W/I四种情况5.日志关键字段6.日志量验证情况7.总结 4.日志会输出F/E/W/I四种情况 在MongoDB7中,日志输出按照严重性分为四种…...
word中插入图片显示不完整,怎么处理让其显示完整?
在WORD里插入图片后,选择嵌入式发现插入的图片显示不正常,只能显示底部一部分,或者遮住文字。出现此故障的原因有可能是设置为固定值的文档行距小于图形的高度,从而导致插入的图形只显示出了一部分。 1.选中图片,然后点…...
SAP S4HANA embedded analytics
SAP S4HANA embedded analytics...
大模型在胃十二指肠溃疡预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与方法 二、胃十二指肠溃疡概述 2.1 疾病定义与分类 2.2 流行病学特征 2.3 病因与发病机制 2.4 临床表现与诊断方法 三、大模型技术原理与应用现状 3.1 大模型基本概念与架构 3.2 在医疗领域的应…...
macos下 ~/.zshrc~ 和 ~/.zshrc
macos下 ~/.zshrc~ 和 ~/.zshrc ~/.zshrc通常是备份文件或临时文件,可能由编辑器(如vim)创建,通常可以安全删除,不会影响系统运行。 在Mac下,这种带~后缀的备份文件通常是由以下情况产生: 常…...
【C语言基础】双指针在qsort函数中的应用
在C语言中使用 qsort 对字符串数组(如 char* 数组)排序时,必须转换为双指针(char**),这是由字符串数组的内存结构和 qsort 的工作原理决定的。以下是详细解释: 一、底层原理分析 1. 字符串数组…...
Android组件刷新
Android中刷新View的方法有以下几种: 调用invalidate()方法,该方法会使View树中的所有视图无效或脏,等待下一次绘制时重新绘制。例如: mCustomView.invalidate(); 调用postInvalidate()方法,该方法类似于invalidate()…...
JavaWeb开发 Servlet底层 Servlet 过滤器 过滤器和拦截器 手写一个限制访问路径的拦截器
目录 万能图 过滤器自我理解 案例 实现Filter 接口 配置文件 web.xml 将过滤器映射到 servlet 用处 拦截器 手写案例 重写 preHandle() 方法 拦截处理 重写 postHandle() 方法 后处理 重写 afterHandle() 方法 完成处理 代码 如何配置拦截器 万能图 还是看一下这张…...
QT中多线程写法
转自个人博客:QT中多线程写法 1. QThread及moveToThread() 使用情况: 多使用于需要将有着复杂逻辑或需要一直占用并运行的类放入子线程中执行的情况,moveToThread是将整个类的对象移入子线程。 优缺点: 优点:更符合…...
0415-批量删除操作
关于删除的全部代码: <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Insert title here</title> <script src"js/jquery-3.7.1.min.js"></script> <srcipt src"js/jqu…...
Day08 【基于余弦相似度实现的表示型文本匹配】
基于余弦相似度实现的表示型文本匹配 目标数据准备参数配置数据处理初始化方法加载数据编码句子补齐与截断重写父类两个方法采样策略加载词表和方案 模型构建SentenceEncoder类SiameseNetwork类优化器配置 主程序验证与评估推理预测测试结果 目标 本文基于给定的词表ÿ…...
【leetcode hot 100 72】编辑距离
解法一:递归 解法二:(动态规划)①定义:dp[i][j]为word1中前i个字符转化为word2中前j个字符所需操作数;dp[m1][n1] ②初始状态:dp[0][j]j(0变为j,需要j步),dp[i][0]i(i变为0ÿ…...
Dubbo、HTTP、RMI之间的区别
Dubbo、HTTP、RMI之间的区别如下: 表格 复制 特性DubboHTTPRMI通信机制基于Netty的NIO异步通信,采用长连接,支持多种序列化方式基于标准的HTTP协议,无状态,每次请求独立基于Java原生的RMI机制,支持Java对…...
Java练习——day1(反射)
文章目录 练习1练习2练习3思考封装原则与反射合理使用反射“破坏”封装的场景 练习1 编写代码,通过反射获取String类的所有公共方法名称,并按字母顺序打印。 示例代码: import java.lang.reflect.Method; import java.util.Arrays;public …...
golang的slice扩容过程
Go 语言中的切片扩容机制是 Go 运行时的一个关键部分,它确保切片在动态增加元素时能够高效地管理内存。这个机制是在 Go 运行时内部实现的,涉及了内存分配、数据拷贝和容量调整。扩容的实现主要体现在 runtime.growslice 函数中。下面我们将深入分析 Go …...
Swift —— delegate 设计模式
一、什么是 delegate 模式 所谓 delegate 就是代理模式。简单来说,delegate 模式就是在类的函数里运行完一段代码后,你可以通过一个符合某个代理协议的属性来调代理的方法。其中,代理方法就是回调函数。 二、delegate 模式与闭包比的优势 …...
Docker 安装 Elasticsearch 8.x
Docker 安装 Elasticsearch 8.x 前言一、准备工作二、设置容器的目录结构三、启动一个临时的容器来复制配置文件四、复制配置文件到本地目录五、删除临时容器六、创建并运行容器,挂载本地目录七、修改文件配置监听端口八、端口配置:Host 网络模式 vs Por…...
Vue工程化开发脚手架Vue CLI
开发Vue有两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。 脚手架Vue CLI Vue CLl 是 Vue 官方…...
开源智慧巡检——无人机油田AI视频监控的未来之力
油田巡检,关乎能源命脉,却常受困于广袤地形、高危环境和人工效率瓶颈。管道泄漏、设备故障、非法闯入——这些隐患稍有疏忽,便可能酿成大患。传统巡检已无法满足现代油田对安全与效率的需求,而无人机油田巡检系统正以智能化之力重…...
数字ic后端设计从入门到精通(含fusion compiler, tcl教学)
pin 在集成电路设计中,特别是在使用工具如 Fusion Compiler 时,理解“引脚”(pin)的基础知识对于设计、优化和验证电路至关重要。以下是从 Fusion Compiler 的角度出发,关于引脚(pin)的基础知识…...
Django从零搭建卖家中心登陆与注册实战
在电商系统开发中,卖家中心是一个重要的组成部分,而用户注册与登陆则是卖家中心的第一步。本文将详细介绍如何使用Django框架从零开始搭建一个功能完善的卖家注册页面,包括前端界面设计和后端逻辑实现。 一、项目概述 我们将创建一个名为sel…...
MySQL表的使用(4)
首先回顾一下之前所学的增删查改,这些覆盖了平时使用的80% 我们上节课中学习到了MySQL的约束 其中Primary key 是主键约束,我们今天要学习的是外键约束 插入一个表 外键约束 父表 子表 这条记录中classid为5时候,不能插入; 删除…...
ollama修改配置使用多GPU,使用EvalScope进行模型压力测试,查看使用负载均衡前后的性能区别
文章目录 省流结论机器配置不同量化模型占用显存1. 创建虚拟环境2. 创建测试jsonl文件3. 新建测试脚本3. 默认加载方式,单卡运行模型3.1 7b模型输出213 tok/s3.1 32b模型输出81 tok/s3.1 70b模型输出43tok/s 4. 使用负载均衡,多卡运行4.1 7b模型输出217t…...
深入定制 QSlider——实现精准点击跳转与拖拽区分
在使用 Qt 编写界面应用时,QSlider 是一个常用的滑动控件。但你可能会注意到,默认情况下点击滑轨(groove)区域时,滑块并不会直接跳到鼠标点击的位置,而是按照内部的分页步进(page step)行为响应。此外,垂直 Slider 在点击最底部时还存在 releaseEvent(或 sliderRelea…...
