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

(每日持续更新)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.mzph.cn/news/593087.shtml

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

相关文章

/etc/profile文件一不小心改坏了,所有命令无法执行了怎么办?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 在部署jdk的时候&#xff0c;修改/etc/profile文件&#xff0c;文件改得有问题&#xff0c;但是当时没有…

【二】CocosCreator-CCGame.js源码分析

PS&#xff1a;只是看源码学习过程中把认为重要的内容以笔记的形式记录下来。 【1】config&#xff1a;当前游戏的一些配置 1.debugMode&#xff1a;用于控制输出日志的级别 2.showFPS&#xff1a;是否显示FPS 3.exposeClassName 4.frameRate&#xff1a;设置游戏帧率 5.id 6.…

redis单机部署

一、下载redis压缩包tar.gz 官网下载&#xff0c;现在一般用6.x以上版本 二、上传指定目录&#xff0c;解压缩 #假如上传到redis用户的家目录 cd /home/redis tar -zxvf redis-6.2.14.tar.gz 三、进入解压缩目录&#xff0c;进行编译 cd redis-6.2.14 make &&a…

SSH以及Dropbear介绍

SSH 1、什么是SSH (1)SSH仅仅是一种协议标准&#xff0c;目的是实现安全远程登录及安全网络服务。 2、实现SSH的工具有哪些 (1)开源OpenSSH&#xff0c;使用最广泛。 (2)Dropbear&#xff0c;轻量级SSH。 3、SSH可以实现的功能场景 (1)安全远程登录 (2)安全的端口转发 ①本地端…

【elfboard linux开发板】5.vmware tools安装及uart属性的获取和设置

1. 安装VMware tools 系统&#xff1a;ubuntu22.04 虚拟机版本&#xff1a;VMware workstation 16 pro&#xff08;16.1.2&#xff09; VMware tools文件&#xff08;iso)一般在虚拟机目录下&#xff0c;如果没有&#xff0c;这是下载网址&#xff0c;找到对应的虚拟机版本下载…

ARM笔记-----输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获&#xff0c;常用的有测量输入信号的脉 宽&#xff0c;和测量 PWM 输入信号的频率和占空比这两种。 输入捕获的大概的原理 当捕获到信号的跳变沿的时候&#xff0c;把计数器 CNT 的值锁存到捕获寄 存器 CCR 中…

2023机器人行业总结,2024机器人崛起元年(具身智能)

2023总结&#xff1a; 1.Chatgpt引爆了通用人工智能&#xff0c;最大的受益者或是机器人&#xff0c;2023年最热门的创业赛道便是人形机器人&#xff0c;优必选更是成为人形机器人上市第一股&#xff0c; 可以说2023年是机器人开启智能化的元年&#xff0c;而2024则将成为机器…

【动态规划】LeetCode-10. 正则表达式匹配

10. 正则表达式匹配。 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 …

winform简易用户权限管理系统

一、功能简介 1. 数据库可使用sqlite、mssql、mysql等 2. 管理员账号不管控&#xff0c;其余账号进行权限管控&#xff08;左侧菜单&#xff0c;表单按钮&#xff09;&#xff0c;且只能看到自己创建的角色、用户 二、操作界面 1. 管理员账号登陆后&#xff0c;左侧菜单栏自动…

SVN迁移至GitLab,并附带历史提交记录

Git在代码管理方面比SVN有更多的优势&#xff0c;如代码审查&#xff0c;分支和合并。 一、准备工作 安装Git环境&#xff0c;配置本地git账户信息&#xff1a; git config --global user.name "XXX" git config --global user.email "XXXmail.com"可通…

对象存储的策略问题

对象存储中的数据可以让其他用户访问吗&#xff1f; 对象存储&#xff08;简称ZOS&#xff09;中的数据有两种常见的方式可以授予其他用户访问权限&#xff1a; 桶级别的访问控制列表&#xff08;ACL&#xff09;&#xff1a;您可以在桶上设置ACL&#xff0c;定义哪些用户具有…

基于矩阵乘的CUDA编程优化过程

背景&#xff1a;网上很多关于矩阵乘的编程优化思路&#xff0c;本着看理论分析万遍&#xff0c;不如实际代码写一遍的想法&#xff0c;大概过一下优化思路。 矩阵乘的定义如下&#xff0c;约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

C/C++汇编学习(一)——C++代码到汇编代码的转换

目录 一、 学习C编译过程 预处理器的作用 编译器如何将C代码转换为汇编 汇编代码示例&#xff08;假设&#xff09; 链接器的作用 二、 使用编译器探索C代码的汇编表示 使用GCC查看汇编输出 使用Visual Studio查看汇编输出 比较不同优化级别的汇编代码 三、 理解C控制…

判断两张图片是否完全一致

判断两张图片是否为完全相同的图片 批量判断尺寸 大小 图像展示内容体是否完全一致的图片 import os import hashlib from PIL import Imagedef check_img_repeat(directory):"""批量对图片进行重复性校验是检查一组图像中是否有相同或几乎相同的图像副本。一…

Linux C/C++ 获取CPUID

实现方式&#xff1a; INTEL CC 格式 AT^T CC 格式 GCC/C库 __cpuid 宏 大致讲义&#xff1a; AT^T 格式汇编很反人类&#xff0c;GCC可以改编译器选项为INTEL内嵌汇编&#xff0c;但一般在GCC还是按照默认的AT^T汇编来拽写把&#xff0c;不想用也可以让AI工具把INTEL内嵌…

神经网络模型常见的类型介绍

神经网络模型有很多种类型&#xff0c;下面是一些常见的神经网络模型&#xff1a; 前馈神经网络&#xff08;Feedforward Neural Network&#xff09;&#xff1a;这是最简单、最基础的神经网络形式。在这种网络中&#xff0c;信息只朝一个方向流动&#xff0c;从输入节点经过…

Redis命令---String篇 (超全)

目录 1.Redis Setnx 命令 - 只有在 key 不存在时设置 key 的值。简介语法可用版本: > 1.0.0返回值: 设置成功&#xff0c;返回 1 。 设置失败&#xff0c;返回 0 。 示例 2.Redis Getrange 命令 - 返回 key 中字符串值的子字符简介语法可用版本: > 2.4.0返回值: 截取得到…

2024年个人工作计划怎么写?新年待办计划这样写更方便

元旦的钟声还在耳边回响&#xff0c;2024年的新篇章已经开启。面对新的一年&#xff0c;我深知一个清晰、实用的个人工作计划是多么重要。它不仅是指引我前进的灯塔&#xff0c;更是我实现目标、提升效率的秘密武器。 但如何制定这样一个计划呢&#xff1f;在过去&#xff0c;…

嵌入式开发——ADC开发

学习目标 了解ADC开发流程掌握采样方式能够使用ADC进行芯片内部通道进行采样能够使用ADC对外部电路进行采样学习内容 GD32F4的ADC 特点: 16个外部模拟输入通道;1个内部温度传感通道(VSENSE);1个内部参考电压输入通道(VREFINT);1个外部监测电池VBAT供电引脚输入通道。ADC开…

《工具录》nslookup

工具录 1&#xff1a;nslookup2&#xff1a;选项介绍3&#xff1a;示例 - 命令行模式3.1&#xff1a;查询类型设置3.2&#xff1a;指定 DNS 服务器 4&#xff1a;示例 - 交互模式5&#xff1a;其他 本文以 kali-linux-2023.3-vmware-amd64 为例。 1&#xff1a;nslookup nsloo…