BufferedReader 终极解析与记忆指南

news2025/4/16 11:21:40

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

sequenceDiagram
    participant Program
    participant BufferedReader
    participant ActualReader
    
    Program->>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

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

黄金法则

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

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

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

相关文章

(小白0基础) 微调deepseek-8b模型参数详解以及全流程——训练篇

​ 本篇参考bilibili如何在本地微调DeepSeek-R1-8b模型_哔哩哔哩_bilibili 上篇&#xff1a;(小白0基础) 租用AutoDL服务器进行deepseek-8b模型微调全流程(Xshell,XFTP) —— 准备篇 初始变量 max_seq_length 2048 dtype None load_in_4bit True单批次最大处理模型大小dy…

关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析

以下是关于汽车辅助驾驶不同等级、技术对比、传感器差异及未来发展方向的详细分析&#xff1a; 一、汽车辅助驾驶等级详解 根据SAE&#xff08;国际自动机工程师学会&#xff09;的标准&#xff0c;自动驾驶分为 L0到L5 六个等级&#xff1a; 1. L0&#xff08;无自动化&…

mongodb7日志特点介绍:日志分类、级别、关键字段(下)

#作者&#xff1a;任少近 上篇《mongodb7日志特点介绍&#xff1a;日志分类、级别、关键字段(上)》 链接: link 文章目录 4.日志会输出F/E/W/I四种情况5.日志关键字段6.日志量验证情况7.总结 4.日志会输出F/E/W/I四种情况 在MongoDB7中&#xff0c;日志输出按照严重性分为四种…

word中插入图片显示不完整,怎么处理让其显示完整?

在WORD里插入图片后&#xff0c;选择嵌入式发现插入的图片显示不正常&#xff0c;只能显示底部一部分&#xff0c;或者遮住文字。出现此故障的原因有可能是设置为固定值的文档行距小于图形的高度&#xff0c;从而导致插入的图形只显示出了一部分。 1.选中图片&#xff0c;然后点…

SAP S4HANA embedded analytics

SAP S4HANA embedded analytics

JavaWeb开发 Servlet底层 Servlet 过滤器 过滤器和拦截器 手写一个限制访问路径的拦截器

目录 万能图 过滤器自我理解 案例 实现Filter 接口 配置文件 web.xml 将过滤器映射到 servlet 用处 拦截器 手写案例 重写 preHandle() 方法 拦截处理 重写 postHandle() 方法 后处理 重写 afterHandle() 方法 完成处理 代码 如何配置拦截器 万能图 还是看一下这张…

【leetcode hot 100 72】编辑距离

解法一&#xff1a;递归 解法二&#xff1a;&#xff08;动态规划&#xff09;①定义&#xff1a;dp[i][j]为word1中前i个字符转化为word2中前j个字符所需操作数;dp[m1][n1] ②初始状态&#xff1a;dp[0][j]j(0变为j&#xff0c;需要j步)&#xff0c;dp[i][0]i(i变为0&#xff…

Java练习——day1(反射)

文章目录 练习1练习2练习3思考封装原则与反射合理使用反射“破坏”封装的场景 练习1 编写代码&#xff0c;通过反射获取String类的所有公共方法名称&#xff0c;并按字母顺序打印。 示例代码&#xff1a; import java.lang.reflect.Method; import java.util.Arrays;public …

Docker 安装 Elasticsearch 8.x

Docker 安装 Elasticsearch 8.x 前言一、准备工作二、设置容器的目录结构三、启动一个临时的容器来复制配置文件四、复制配置文件到本地目录五、删除临时容器六、创建并运行容器&#xff0c;挂载本地目录七、修改文件配置监听端口八、端口配置&#xff1a;Host 网络模式 vs Por…

Vue工程化开发脚手架Vue CLI

开发Vue有两种方式 核心包传统开发模式&#xff1a;基于html / css / js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue。工程化开发模式&#xff1a;基于构建工具&#xff08;例如&#xff1a;webpack&#xff09;的环境中开发Vue。 脚手架Vue CLI Vue CLl 是 Vue 官方…

开源智慧巡检——无人机油田AI视频监控的未来之力

油田巡检&#xff0c;关乎能源命脉&#xff0c;却常受困于广袤地形、高危环境和人工效率瓶颈。管道泄漏、设备故障、非法闯入——这些隐患稍有疏忽&#xff0c;便可能酿成大患。传统巡检已无法满足现代油田对安全与效率的需求&#xff0c;而无人机油田巡检系统正以智能化之力重…

Django从零搭建卖家中心登陆与注册实战

在电商系统开发中&#xff0c;卖家中心是一个重要的组成部分&#xff0c;而用户注册与登陆则是卖家中心的第一步。本文将详细介绍如何使用Django框架从零开始搭建一个功能完善的卖家注册页面&#xff0c;包括前端界面设计和后端逻辑实现。 一、项目概述 我们将创建一个名为sel…

MySQL表的使用(4)

首先回顾一下之前所学的增删查改&#xff0c;这些覆盖了平时使用的80% 我们上节课中学习到了MySQL的约束 其中Primary key 是主键约束&#xff0c;我们今天要学习的是外键约束 插入一个表 外键约束 父表 子表 这条记录中classid为5时候&#xff0c;不能插入&#xff1b; 删除…

ollama修改配置使用多GPU,使用EvalScope进行模型压力测试,查看使用负载均衡前后的性能区别

文章目录 省流结论机器配置不同量化模型占用显存1. 创建虚拟环境2. 创建测试jsonl文件3. 新建测试脚本3. 默认加载方式&#xff0c;单卡运行模型3.1 7b模型输出213 tok/s3.1 32b模型输出81 tok/s3.1 70b模型输出43tok/s 4. 使用负载均衡&#xff0c;多卡运行4.1 7b模型输出217t…

Dijkstra算法求解最短路径—— 从零开始的图论讲解(2)

前言 在本系列第一期:从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序-CSDN博客 笔者给大家介绍了 图的概念,如何存图,如何简单遍历图,已经什么是图的拓扑排序 按照之前的学习规划&#xff0c;今天笔者将继续带大家深入了解图论中的一个核心问题&#x…

[连载]Transformer架构详解

Transformer: Attention Is All You Need Paper 地址&#xff1a;https://arxiv.org/abs/1706.03762 Paper 代码&#xff1a;https://github.com/tensorflow/tensor2tensor Paper 作者&#xff1a;Ashish Vaswani,Noam Shazeer,Niki Parmar,Jakob Uszkoreit,Llion Jones,Aidan…

LVGL Video控件和Radiobtn控件详解

LVGL Video控件和Radiobtn控件详解 一、 Video控件详解1. 概述2. 创建和初始化3. 基本属性设置4. 视频控制5. 回调函数6. 高级功能7. 注意事项 二、Radiobtn控件详解1. 概述2. 创建和初始化3. 属性设置4. 状态控制5. 组管理6. 事件处理7. 样式设置8. 注意事项 三、效果展示四、…

组合数哭唧唧

前言&#xff1a;手写一个简单的组合数&#xff0c;但是由于长期没写&#xff0c;导致一些细节没处理好 题目链接 #include<bits/stdc.h> using namespace std; #define endl "\n"#define int long longconst int N (int)2e510; const int Mod (int)1e97;int…

NLP高频面试题(四十二)——RAG系统评估:方法、指标与实践指南

1. 引言:RAG系统概述与评估挑战 检索增强生成(Retrieval-Augmented Generation,简称 RAG)是近年来自然语言处理领域的一个重要进展。RAG系统在大型语言模型生成文本的过程中引入了外部检索模块,从外部知识库获取相关信息,以缓解纯生成模型可能出现的幻觉和知识盲点。通过…

Linux路漫漫

目录 Vim模式 基本操作 文本编辑 更多功能 1. 直接启动 Vim 2. 打开一个已存在的文件 3. 打开多个文件 4. 以只读模式打开文件 5. 从指定行号开始编辑 6. 快速打开并执行命令 7. 检查是否安装了 Vim 8. 退出 Vim 前提条件 SCP 命令格式 具体操作 1. Windows 命…