(每日持续更新)jdk api之BufferedReader基础

news/2024/4/16 3:07:07

(每日持续更新)jdk api之BufferedReader基础

1.8 BufferedReader

BufferedReader 是 Java 中 Reader 的缓冲流实现,用于提高读取字符数据的性能。它提供了一些额外的属性和方法,以增强对字符流的操作。

以下是 BufferedReader 的一些常用属性和方法:

属性:
  1. protected char[] cb
    • 用于存储缓冲数据的字符数组。可以通过构造函数指定缓冲区大小,也可以通过 getBuf() 方法获取。
  2. protected int nChars
    • 缓冲区中当前有效字符的数量。
  3. protected int nextChar
    • 下一个要被读取的字符的索引。当达到缓冲区末尾时,会触发填充缓冲区的操作。
  4. protected Reader in
    • 内部原始的字符输入流。可以通过构造函数传入或通过 getIn() 方法获取。
构造函数:
  1. BufferedReader(Reader in)
    • 使用默认缓冲区大小创建 BufferedReader 对象。
  2. BufferedReader(Reader in, int size)
    • 使用指定缓冲区大小创建 BufferedReader 对象。
方法:
  1. void close()
    • 关闭字符输入流及其底层流。
  2. void mark(int readAheadLimit)
    • 在当前流位置设置标记,最多允许跳过 readAheadLimit 个字符。
  3. boolean markSupported()
    • 判断此流是否支持 markreset 操作。
  4. int read()
    • 读取单个字符。返回读取的字符的 Unicode 值,如果已到达流的末尾,则返回 -1。
  5. int read(char[] cbuf, int off, int len)
    • 将字符读入数组 cbuf,从偏移量 off 开始,最多读取 len 个字符。返回实际读取的字符数,如果已到达流的末尾,则返回 -1。
  6. String readLine()
    • 读取一行文本。返回包含行内容的字符串,不包括行终止符(\r\n\r\n)。
  7. boolean ready()
    • 判断是否可以从流中读取数据,而不会被阻塞。
  8. void reset()
    • 将流的位置重置到最后一次调用 mark 方法设置的位置。
  9. long skip(long n)
    • 跳过输入流中的 n 个字符。
使用示例:
javaCopy code
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class BufferedReaderExample {public static void main(String[] args) {String filePath = "example.txt";try (FileReader fileReader = new FileReader(filePath);BufferedReader bufferedReader = new BufferedReader(fileReader)) {String line;while ((line = bufferedReader.readLine()) != null) {// 处理读取的每一行文本System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,BufferedReader 被用来包装一个 FileReader,以提供缓冲功能。通过 readLine 方法逐行读取文本文件内容。这种方式能够提高读取性能,减少与底层输入流的直接交互次数。

应用场景

BufferedReader 主要用于提高读取字符数据的性能,特别是在读取文本文件时。以下是一些适合使用 BufferedReader 的应用场景:

  1. 文本文件读取:

    • 当从文本文件中逐行读取数据时,使用 BufferedReader 可以提高读取效率。
    javaCopy code
    try (FileReader fileReader = new FileReader("example.txt");BufferedReader bufferedReader = new BufferedReader(fileReader)) {String line;while ((line = bufferedReader.readLine()) != null) {// 处理读取的每一行文本System.out.println(line);}
    } catch (IOException e) {e.printStackTrace();
    }
    
  2. 网络数据读取:

    • 在从网络连接中读取字符数据时,使用 BufferedReader 可以减少网络 I/O 操作,提高读取性能。
    javaCopy code
    try (Socket socket = new Socket("example.com", 80);InputStream socketInputStream = socket.getInputStream();InputStreamReader reader = new InputStreamReader(socketInputStream);BufferedReader bufferedReader = new BufferedReader(reader)) {String line;while ((line = bufferedReader.readLine()) != null) {// 处理读取的每一行文本System.out.println(line);}
    } catch (IOException e) {e.printStackTrace();
    }
    
  3. 日志文件分析:

    • 当分析大型日志文件时,使用 BufferedReader 可以逐行读取日志信息,方便进行分析和处理。
    javaCopy code
    try (FileReader fileReader = new FileReader("application.log");BufferedReader bufferedReader = new BufferedReader(fileReader)) {String line;while ((line = bufferedReader.readLine()) != null) {// 分析日志信息// ...}
    } catch (IOException e) {e.printStackTrace();
    }
    
  4. 配置文件解析:

    • 在解析配置文件时,使用 BufferedReader 可以方便地逐行读取配置信息。
    javaCopy code
    try (FileReader fileReader = new FileReader("config.properties");BufferedReader bufferedReader = new BufferedReader(fileReader)) {String line;while ((line = bufferedReader.readLine()) != null) {// 解析配置信息// ...}
    } catch (IOException e) {e.printStackTrace();
    }
    

总体而言,当需要频繁读取字符数据时,尤其是逐行读取文本文件时,使用 BufferedReader 可以减少 I/O 操作的次数,提高读取性能。在实际应用中,可以根据具体的场景和性能需求选择是否使用缓冲流。

实战例子

在实际项目中,BufferedReader 可以用于处理文本文件的读取。下面是一个简化的例子,模拟一个日志分析系统,从日志文件中读取数据并进行分析。

日志实体类:

javaCopy code
import java.util.Date;public class LogEntry {private Date timestamp;private String message;// 构造方法、getter 和 setter 省略
}

日志分析器:

javaCopy code
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;public class LogAnalyzer {private static final String LOG_FILE_PATH = "application.log";public static void main(String[] args) {List<LogEntry> logEntries = readAndAnalyzeLogs();// 在实际项目中,可以进一步对 logEntries 进行分析和处理for (LogEntry entry : logEntries) {System.out.println(entry.getTimestamp() + " - " + entry.getMessage());}}private static List<LogEntry> readAndAnalyzeLogs() {List<LogEntry> logEntries = new ArrayList<>();try (FileReader fileReader = new FileReader(LOG_FILE_PATH);BufferedReader bufferedReader = new BufferedReader(fileReader)) {String line;while ((line = bufferedReader.readLine()) != null) {LogEntry logEntry = parseLogEntry(line);if (logEntry != null) {logEntries.add(logEntry);}}} catch (IOException e) {e.printStackTrace();}return logEntries;}private static LogEntry parseLogEntry(String logLine) {try {// 假设日志的格式为 "yyyy-MM-dd HH:mm:ss - Log message"SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");int timestampEndIndex = logLine.indexOf(" - ");if (timestampEndIndex != -1) {String timestampString = logLine.substring(0, timestampEndIndex);Date timestamp = dateFormat.parse(timestampString);String message = logLine.substring(timestampEndIndex + 3);return new LogEntry(timestamp, message);}} catch (ParseException e) {e.printStackTrace();}return null;}
}

在这个例子中,LogAnalyzer 类使用了 BufferedReader 从日志文件中读取数据。每一行日志都被解析为一个 LogEntry 对象,然后将这些对象存储在 logEntries 列表中。在实际项目中,你可以在 readAndAnalyzeLogs 方法中添加更多的日志分析逻辑。这个例子仅仅是一个演示,实际的日志分析系统可能会更加复杂。


http://www.ppmy.cn/news/1292119.html

相关文章

【Spring实战】21 Spring Data REST 常用功能详细介绍

文章目录 1. 资源导出&#xff08;Resource Exporting&#xff09;2. 查询方法&#xff08;Query Methods&#xff09;3. 分页和排序&#xff08;Pagination and Sorting&#xff09;4. 关联关系&#xff08;Associations&#xff09;5. 事件&#xff08;Events&#xff09;6. …

非常好用的ocr图片文字识别技术,识别图片中的文字

目录 一.配置环境 二.应用 2.1常见图片识别 2.2排版简单的印刷体截图图片识别 2.3竖排文字识别 2.4英文识别 2.5繁体中文识别 2.6单行文字的图片识别 三.参考 一.配置环境 pip3 install cnocr -i https://pypi.tuna.tsinghua.edu.cn/simple pip3 install onnxruntime…

建立java和sql的连接(为聊天窗口添加注册功能)

建立java和sql的连接(为聊天窗口添加注册功能) 1.1首先需要导入mysql的相关包&#xff0c;将下好的jar文件拖入在src中新建立的lib文件夹(directory)里面&#xff0c;然后将lib进行add as library就算导入成功了 2.1明确dao是什么 DAO&#xff08;Data Access Object&#x…

Spark内核解析-数据存储5(六)

1、Spark的数据存储 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk&#xff0c;本文尝试分析Spark中存储子系统的构成&#xff0c;并以数据写入和数据读取为例&#xff0c;讲述清楚存储子系统中各部件的交互关系。 1.1存储子系统概览 …

Oracle-触发器

简介 触发器:trigger数据库中的触发器是一个与表相关的存储plsql的语句 每当一个特定的数据操作语句(DML, insertupdate ,delete)在指定的表上发出时, oracle自动执行触发器中定义的语句序列 语法 例如:当部门表新增一条记录后&#xff0c;自动打印:′恭喜你,数据已经成功插入…

Spark内核解析-节点启动4(六)

1、Master节点启动 Master作为Endpoint的具体实例&#xff0c;下面我们介绍一下Master启动以及OnStart指令后的相关工作 1.1脚本概览 下面是一个举例&#xff1a; /opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/ha…

uView Textarea 文本域

文本域此组件满足了可能出现的表单信息补充&#xff0c;编辑等实际逻辑的功能&#xff0c;内置了字数校验等 注意&#xff1a; 由于在nvue下&#xff0c;u-textarea名称被uni-app官方占用&#xff0c;在nvue页面中请使用u--textarea名称&#xff0c;在vue页面中使用u--textar…

flutter 之proto

和嵌入式用proto协议来通信&#xff0c;以mac来演示 先在电脑上安装protobuf&#xff08;在博主文章内容里面搜Mac安装protobuf&#xff09;&#xff0c;然后在桌面上放这几个文件&#xff0c;且build_proto_dart.sh文件内容如图所示 #!/bin/bashSCRIPT$(readlink -f "$0…

.NET C# 如何获取object对象的数据

如何获取object对象的数据 在DAL层&#xff0c;一般会封装一些返回值&#xff0c;返回的类型就会为object &#xff0c;但是需要其中的值进行判断 public static object SaveFileIns(string filepath){return new { path pathlist, file_name fileNamelist, Message "…

数字信号处理期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

k8s之pod的基础(下)

k8s的pod重启策略 Always deployment的yaml文件只能是Always pod的yaml三种模式都可以&#xff0c;不论正常退出还是非正常退出都重启 OnDailure&#xff1a; 只有状态码非0才会重启。正常退出是不重启的 Never 正常退出和非正常退出都不重启 容器的退出了&#xff0c;pod才…

set注入专题

1.1注入外部Bean 在之前使用的案例就是注入外部Bean的方式。 <!-- class属性声明要管理哪个类中的对象 property标签的name是提示set方法名ref标签指明注入的bean的id--><bean id"userServiceBean" class"com.powernode.spring6.service.UserService…

制药企业符合CSV验证需要注意什么?

在制药行业中&#xff0c;计算机化系统验证&#xff08;CSV&#xff09;是确保生产过程的合规性和数据完整性的关键要素。通过CSV验证&#xff0c;制药企业可以保证其计算机化系统的可靠性和合规性&#xff0c;从而确保产品质量和患者安全。然而&#xff0c;符合CSV验证并不是一…

Spring 应用合并之路(一):摸石头过河 | 京东云技术团队

公司在推进降本增效&#xff0c;在尝试多种手段之后&#xff0c;发现应用太多&#xff0c;每个应用都做跨机房容灾部署&#xff0c;则最少需要 4 台机器&#xff08;称为容器更合适&#xff09;。那么&#xff0c;将相近应用做一个合并&#xff0c;减少维护项目&#xff0c;提高…

stable diffusion 基础教程-图生图

界面 图生图大概有以下几个功能: 图生图涂鸦绘制局部绘制局部绘制(涂鸦蒙版)其常用的也就上面四个,接下来逐步讲解。 以图反推提示词 图生图可以根据反推提示词来获取相应图片的提示词,目前3种主流方式,如下: CLIP反推提示词:推导出的文本倾向于自然语言的描述方式,…

Linux系统使用超详细(六)~进程管理

目录 一、认识进程 二、进程号 2.1.进程号概念 2.2.进程号作用 三、进程查看 3.1. ps命令&#xff1a; 3.2. top命令&#xff1a; 3.3. htop命令&#xff1a; 3.4. pstree命令&#xff1a; 3.5. pgrep命令&#xff1a; 四、进程状态 五、进程优先级 六、进程优先…

Java商城 免 费 搭 建:鸿鹄云商实现多种商业模式,VR全景到SAAS,应有尽有

鸿鹄云商 b2b2c产品概述 【b2b2c平台】&#xff0c;以传统电商行业为基石&#xff0c;鸿鹄云商支持“商家入驻平台自营”多运营模式&#xff0c;积极打造“全新市场&#xff0c;全新 模式”企业级b2b2c电商平台&#xff0c;致力干助力各行/互联网创业腾飞并获取更多的收益。从消…

Leetcode_day01_88合并两个有序数组

Leetcode_day01_88合并两个有序数组 题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺…

Embree使用指南(无SYCL)

IntelEmbree是由Intel开发的高性能光线跟踪库&#xff0c;以Apache 2.0许可证的开源形式发布。 Embree的目标是图形应用程序开发人员&#xff0c;以提高逼真照片渲染应用程序的性能。Embree针对生产渲染进行了优化&#xff0c;重点关注非相干光线性能、高质量的加速结构构建、丰…

DBA技术栈(二):MySQL 存储引擎

2.1 MySQL存储引擎概述 上个业余的图&#xff1a; MyISAM 存储引擎是 MySQL 默认的存储引擎&#xff0c;也是目前 MySQL 使用最为广泛的存储引擎之一。他的前身就是我们在 MySQL 发展历程中所提到的 ISAM&#xff0c;是 ISAM 的升级版本。在 MySQL最开始发行的时候是 ISAM 存…
最新文章