(每日持续更新)jdk api之FilterReader基础、应用、实战

news/2024/9/12 18:28:57/

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

一、java.io

1.27 FilterReader

在 Java I/O 中,FilterReader 是用于提供字符输入流过滤功能的抽象基类,它继承自 ReaderFilterReader 本身没有添加新的方法,但它可以作为其他字符输入流的包装器,通过添加过滤功能来修改字符输入流的行为。

FilterReader 介绍:

FilterReader 提供了一个通用的框架,可用于实现字符输入流的过滤器。过滤器是字符输入流的派生类,通过在读取字符数据之前或之后对数据进行处理来修改其行为。FilterReader 的派生类通常会覆盖其中的一些方法,以实现特定的过滤逻辑。

FilterReader 所有字段:

FilterReader 类没有公共字段。

FilterReader 构造方法:

FilterReader 的构造方法主要是通过将其他字符输入流作为参数传递来创建过滤器。以下是构造方法:

  • protected FilterReader(Reader in) 创建一个新的 FilterReader,给定要进行过滤的基础字符输入流。

FilterReader 方法摘要:

FilterReader 类继承了 Reader 的所有方法,但没有添加新的方法。以下是一些常用的方法:

  • int read() 读取单个字符的数据。

  • int read(char[] cbuf) 从输入流中读取一些字符,并将它们存储到字符数组 cbuf 中。

  • int read(char[] cbuf, int off, int len) 从输入流中读取最多 len 个字符的数据,并将其存储到字符数组 cbuf 中,从偏移量 off 开始。

  • long skip(long n) 跳过输入流中的 n 个字符。

  • boolean ready() 返回是否可以从输入流中读取字符而不阻塞。

  • boolean markSupported() 返回此流是否支持 mark()reset() 操作。

  • void mark(int readAheadLimit) 在当前位置标记输入流,并允许后续的 reset() 操作在 readAheadLimit 字符之前重新定位流。

  • void reset() 将输入流重新定位到上次调用 mark() 方法时的位置。

  • void close() 关闭输入流。

简单使用例子:

以下是一个简单的例子,演示如何使用 FilterReader 的一个具体子类 BufferedReader 进行字符输入流的缓冲:

javaCopy code
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
​
public class BufferedReaderExample {
​public static void main(String[] args) {try (Reader fileReader = new FileReader("example.txt");Reader bufferedReader = new BufferedReader(fileReader)) {
​// 通过缓冲输入流读取字符数据int data;while ((data = bufferedReader.read()) != -1) {System.out.print((char) data);}
​} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,我们使用 BufferedReaderFileReader 进行了包装。BufferedReaderFilterReader 的一个子类,它通过在内存中创建一个缓冲区来提高字符输入流的性能。通过使用过滤器,我们可以更方便地添加额外的功能,而不改变基础字符输入流的行为。

应用场景

FilterReader 主要用于实现字符输入流的过滤功能,以下是一些应用场景和相应的代码实现:

1. 缓冲输入流:
  • 场景: 提高字符输入流的性能,避免每次读取都直接操作文件。

  • 代码实现:

    javaCopy code
    try (Reader fileReader = new FileReader("example.txt");Reader bufferedReader = new BufferedReader(fileReader)) {
    ​// 使用缓冲输入流读取字符数据int data;while ((data = bufferedReader.read()) != -1) {System.out.print((char) data);}
    ​
    } catch (IOException e) {e.printStackTrace();
    }
2. 解析基本数据类型:
  • 场景: 从字符输入流中读取基本数据类型的值,如 intfloat 等。

  • 代码实现:

    javaCopy code
    try (Reader fileReader = new FileReader("data.txt");Reader reader = new BufferedReader(fileReader);Reader dataReader = new DataFilterReader(reader)) {
    ​// 从数据流中读取整数int intValue = dataReader.read();System.out.println("Read integer value: " + intValue);
    ​
    } catch (IOException e) {e.printStackTrace();
    }
3. 自定义过滤器:
  • 场景: 实现自定义的字符输入流过滤器以满足特定需求。

  • 代码实现:

    javaCopy code
    class MyFilterReader extends FilterReader {// 自定义过滤器的实现...
    ​MyFilterReader(Reader in) {super(in);}
    }
    ​
    // 在代码中使用自定义的过滤器
    try (Reader fileReader = new FileReader("example.txt");Reader customFilterReader = new MyFilterReader(fileReader)) {
    ​// 使用自定义过滤器读取字符数据int data;while ((data = customFilterReader.read()) != -1) {System.out.print((char) data);}
    ​
    } catch (IOException e) {e.printStackTrace();
    }
4. 异常处理:
  • 场景: 在读取字符数据时处理可能的异常。

  • 代码实现:

    javaCopy code
    try (Reader fileReader = new FileReader("example.txt")) {// 读取字符数据int data;while ((data = fileReader.read()) != -1) {// 处理数据}
    } catch (IOException e) {System.err.println("Error reading from the file: " + e.getMessage());
    }
5. 字符流转换:
  • 场景: 将字符输入流转换为其他字符编码。

  • 代码实现:

    javaCopy code
    try (Reader fileReader = new FileReader("utf8_data.txt");Reader utf16Reader = new InputStreamReader(fileReader, StandardCharsets.UTF_16)) {
    ​// 使用字符流转换器读取字符数据int data;while ((data = utf16Reader.read()) != -1) {System.out.print((char) data);}
    ​
    } catch (IOException e) {e.printStackTrace();
    }

这些例子展示了在不同场景下使用 FilterReader 的一些常见用法。在实际应用中,具体的使用方式取决于需求和对字符输入流的定制化需求。

项目实战

在一个实际项目中,使用 FilterReader 的场景可能涉及到一些特定的需求,比如数据解析、字符编码转换、异常处理等。以下是一个简单的项目实战例子,演示如何使用 FilterReader 的子类 LineNumberReader 进行文件的逐行读取,并记录行号。

项目要求:
  1. 有一个文本文件 example.txt,需要逐行读取该文件的内容,并记录每行的行号。

  2. 使用 LineNumberReader 进行逐行读取,并在每行的开头添加行号信息。

  3. 将读取后的内容输出到控制台。

项目实战代码:
javaCopy code
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
​
public class LineNumberReaderProject {
​public static void main(String[] args) {try (Reader fileReader = new FileReader("example.txt");Reader lineNumberReader = new LineNumberReader(fileReader)) {
​// 使用 LineNumberReader 逐行读取文件内容并输出带行号的结果String line;while ((line = ((LineNumberReader) lineNumberReader).readLine()) != null) {System.out.println("Line " + ((LineNumberReader) lineNumberReader).getLineNumber() + ": " + line);}
​} catch (IOException e) {e.printStackTrace();}}
}

在这个例子中,我们使用了 LineNumberReaderFileReader 进行了包装。LineNumberReaderFilterReader 的一个子类,它可以记录当前行号,并提供了 readLine() 方法来逐行读取文本内容。通过使用过滤器,我们方便地实现了逐行读取并记录行号的功能。在真实项目中,可能还需要考虑异常处理、日志记录等方面的更多细节。


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

相关文章

2401llvm,clang的libtooling

LibTooling(库工具) LibTooling是个支持基于Clang编写独立工具的库. 为LLVM设置Clang工具,在此 介绍 用LibTooling构建的工具(如Clang插件)通过代码运行FrontendActions. 这里演示运行Clang的快速检查一堆代码语法的SyntaxOnlyAction的不同方法. 解析内存中的代码片 如果想…

leetcode2171 拿出最少数目的魔法豆

题目 给定一个 正整数 数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 袋子中(即 至少还有一颗 魔法豆的袋子)魔法豆的数目…

LabVIEW电火花线切割放电点位置

介绍了一个电火花线切割放电点位置分布评价系统,特别是在系统组成、硬件选择和LabVIEW软件应用方面。 本系统由两个主要部分组成:硬件和软件。硬件部分包括电流传感器、高速数据采集卡、开关电源、电阻和导线。软件部分则由LabVIEW编程环境构成&#xf…

ChatGPT与生成式AI在教育领域的应用前景光明,但也伴随着挑战

随着ChatGPT和其他生成式AI技术,如GPT-3.5、GPT-4的出现,我们正见证教育领域一场前所未有的变革浪潮。这些技术不仅推动了教育方式的进步,也为学习者带来了全新的机遇和挑战。 NO.1 教育变革的新浪潮 生成式AI技术,特别是ChatGPT…

2023年12月青少年机器人技术等级考试(六级)理论综合试卷

2023年12月青少年机器人技术等级考试(六级)理论综合试卷 单选题 第 1 题 单选题 IPv6地址长度及其地址分隔符分别是?( ) A.32 . B.128 . C.32 : D.128 : 第 2 题 单选题 浏览网页时,使用应用层的…

如何在Docker下部署MinIO存储服务通过Buckets实现文件的远程上传

📑前言 本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &#…

GPTBots:利用FlowBot中的卡片和表单信息,提供丰富的客服体验

在当今的数字化时代,客户服务的形式和体验正在经历着前所未有的变革。传统的文字消息方式已经无法满足现代用户对于服务体验的多元化需求。那么,如何才能在这个信息爆炸的时代,让我们的服务方式更加个性化、多样化,从而提供更丰富…

element-ui 打包流程源码解析(下)

目录 目录结构和使用1,npm 安装1.1,完整引入1.2,按需引入 2,CDN3,国际化 接上文:element-ui 打包流程源码解析(上) 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

C语言常见面试题:什么是宏,宏的作用是什么?

宏在计算机科学中是一种批量处理程序命令,它是一种抽象的规则或模式,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。在编译时,预处理器会对宏进行…

【剑指offer】重建二叉树

👑专栏内容:力扣刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer:重建二叉树 给定节…

Mybatis 动态SQL条件查询(注释和XML方式都有)

需求 : 根据用户的输入情况进行条件查询 新建了一个 userInfo2Mapper 接口,然后写下如下代码,声明 selectByCondition 这个方法 package com.example.mybatisdemo.mapper; import com.example.mybatisdemo.model.UserInfo; import org.apache.ibatis.annotations.*; import j…

Java快速转Go入门案例

Golang语言在2009年诞生于谷歌,相较而言是一门年轻的语言。面对C等老牌语言众多繁重的特性,几名谷歌员工希望能够甩开历史包袱设计一门更加简洁的编程语言,避免过度的设计,通过较少的特性组合连接就可实现复杂的功能。体现“少即是…

2024年第十二届亚洲机械与材料工程国际会议(ACMME 2024)即将召开!

时间:2024年6月14-17日 地点:日本京都先端科学大学太秦校区 会议官网:第11届ACMME |日本京都 2024年第十二届亚洲机械与材料工程会议 (ACMME 2024)将于2024年6月14日-17日在日本京都先端科学大学召开。亚洲机械与材料…

使用DTS实现TiDB到GaiaDB数据迁移

1 概览 本文主要介绍通过 DTS 数据迁移功能,结合消息服务 for Kafka 与 TiDB 数据库的 Pump、Drainer 组件,完成从TiDB迁移至百度智能云云原生数据库 GaiaDB。 消息服务 for Kafka:详细介绍参见:消息服务 for Kafka 产品介绍百度智…

深度学习笔记(九)——tf模型导出保存、模型加载、常用模型导出tflite、权重量化、模型部署

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 本篇博客主要是工具性介绍,可能由于软件版本问题导致的部分内容无法使用。 首先介绍tflite: TensorFlow Lite 是一组工具,可帮助开…

元组转字符串的两种方法str()和tuple.__str__()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 元组转字符串的两种方法 str()和tuple.__str__() 选择题 以下代码三次输出的结果中type分别为? tup (1,2,3) print("【显示】tup,type(tup)") print(tup,type(tup)) pr…

Spring SpEL在Flink中的应用-SpEL详解

前言 Spring 表达式语言 Spring Expression Language(简称 SpEL )是一个支持运行时查询和操做对象图的表达式语言 。 语法相似于 EL 表达式 ,但提供了显式方法调用和基本字符串模板函数等额外特性。SpEL 在许多组件中都得到了广泛应用&#x…

React Native性能优化指南

摘要 本文将介绍在React Native开发中常见的性能优化问题和解决方案,包括ScrollView内无法滑动、热更新导致的文件引用问题、高度获取、强制横屏UI适配、低版本RN适配iOS14、缓存清理、navigation参数取值等。通过代码案例演示和详细说明,帮助开发者更好…

一起玩儿物联网人工智能小车(ESP32)——44. 利用红外测距模块GP2Y0E03实现避障小车

摘要:本文介绍使用红外测距模块GP2Y0E03实现避障小车 在前边已经介绍了两种非接触测距的办法,分别是超声波测距和激光测距,在这里,再介绍另一种常用的测距传感器——红外测距传感器。红外测距的工作原理是,利用红外信号…

洛谷 P1126 机器人搬重物

题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 NM 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上…