深入理解Java中的Reader类:一步步剖析

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • Reader类
    • 概述
    • 源代码解析
    • 应用场景案例
      • 1. 读取文本文件
      • 2. 读取网络资源
      • 3. 读取字符串
    • 利弊分析
      • 优点
      • 缺点
    • 类代码方法介绍
      • 构造方法
      • 方法
    • 测试用例
      • 测试代码演示
      • 测试结果展示
      • 代码解析
    • 全文小结
  • 总结
  • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

前言

  在Java开发过程中,我们经常需要读取文件中的数据,而数据的读取需要一个合适的类进行处理。Java的IO包提供了许多类用于数据的读取和写入,其中Reader便是其中之一。本文将对Java中的Reader进行详细介绍,并分析其优缺点及应用场景。

摘要

  本文将从以下几个方面对Java中的Reader类进行详细介绍:

  1. Reader类的概述
  2. Reader类代码的解析
  3. Reader类的应用场景案例
  4. Reader类的优缺点分析
  5. Reader类的方法介绍及源代码分析
  6. Reader类的测试用例
  7. 全文小结和总结
  8. 附源码
  9. 建议

  本文通过对Java中的Reader进行详细讲解,旨在帮助开发者更好地掌握Reader的使用方法。

Reader类

概述

  Reader类是Java中用于读取字符流的抽象类。它是所有字符输入流的超类,提供了字符输入流读取时的基本功能。Reader类主要由三个类实现,分别是InputStreamReader、FileReader和CharArrayReader。

源代码解析

  Reader类是一个抽象类,它的源代码定义如下:

public abstract class Reader implements Readable, Closeable {...
}

  其中,Reader实现了两个接口:ReadableCloseableReadable接口中只定义了一个方法:

public interface Readable {int read(CharBuffer cb) throws IOException;
}

  而Closeable接口中也只定义了一个方法:

public interface Closeable extends AutoCloseable {void close() throws IOException;
}

  这两个接口的作用分别是提供读取字符和关闭资源的方法。

应用场景案例

  Reader类通常用于读取文本文件中的数据。比如我们经常使用的BufferedReader就是Reader类的一个子类,用于逐行读取文本文件中的数据。除此之外,Reader还可用于读取网络数据、读取控制台输入等场景。

  下面是几个 使用Reader 类的应用场景案例,同学们仅供参考:

1. 读取文本文件

  使用 FileReader 类来读取文本文件很常见。例如可以使用 FileReaderBufferedReader 组合来读取一个文本文件并逐行输出:

    //1. 读取文本文件public static void testReadFile(){FileReader fileReader;BufferedReader bufferedReader;try {fileReader = new FileReader("./template/fileTest.txt");bufferedReader = new BufferedReader(fileReader);String line;while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}fileReader.close();bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}

通过上述案例,我们本地演示,结果可见如下:

在这里插入图片描述

2. 读取网络资源

可以使用 InputStreamReader 和 URL 类来读取网络资源,例如:

    //2. 读取网络资源public static void testReadURL() throws IOException {URL url = new URL("https://www.baidu.com/");URLConnection conn = url.openConnection();InputStream is = conn.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();isr.close();is.close();}public static void main(String[] args) throws IOException {testReadURL();}

通过上述案例,我们本地演示,结果可见如下:

在这里插入图片描述

3. 读取字符串

可以使用 StringReader 类来将一个字符串转换为字符流,例如:

    //3. 读取字符串public static void testReadStr() throws IOException {String str = "Hello, World!!!";StringReader stringReader = new StringReader(str);int data;while ((data = stringReader.read()) != -1) {System.out.print((char) data);}stringReader.close();}public static void main(String[] args) throws IOException {testReadStr();}

通过上述案例,我们本地演示,结果可见如下:

在这里插入图片描述

  通过介绍及演示以上三个比较常见的 Java 中运用 Reader 类的应用场景案例,通过使用 Reader 类的子类,可以方便地读取各种类型的字符流数据。如果你还有更多贴切生活或工作中的案例,欢迎评论区交流呀,独乐乐不如众乐乐。

利弊分析

优点

  1. Reader类支持字符流的读取,可以准确地读取文本文件中的数据。
  2. Reader类能够自动处理字符编码问题,在读取文件时能够自动转换编码方式。
  3. 可以通过Reader类的各个子类实现不同的功能,使用灵活。

缺点

  1. Reader类读取数据的速度较慢,不适合读取二进制数据。
  2. Reader类不能随机访问文件中的数据,只能逐行读取,读取大文件时效率较低。
  3. Reader类的使用较为繁琐,需要通过缓冲区等方式来提高读取速度和效率。

类代码方法介绍

构造方法

protected Reader()

Reader类的默认构造方法。

方法

public int read() throws IOException

  用处:读取单个字符,并返回该字符的ASCII码,如果到达流的末尾,返回-1。

public int read(char[] cbuf) throws IOException

  用处:读取字符数组,返回读取的字符个数。

public int read(char[] cbuf, int offset, int length) throws IOException

  用处:读取指定长度的字符数组,返回读取的字符个数。

public long skip(long n) throws IOException

  用处:跳过n个字符(包括空格),返回实际跳过的字符数。

public boolean ready() throws IOException

  用处:判断是否可以从流中读取字符,如果可以读取返回true。

public boolean markSupported()

  用处:判断此流是否支持mark()操作。如果支持,则返回true,否则返回false。

public void mark(int readAheadLimit) throws IOException

  用处:设置mark位置,并将输入流中的指针指向mark位置。如果该流不支持mark()操作,则抛出IOException异常。

public void reset() throws IOException

  用处:将输入流中的指针重新指向mark位置。如果该流不支持reset()操作,则抛出IOException异常。

abstract public void close() throws IOException

  用处:关闭该流并释放与之关联的所有资源。

测试用例

以下是一个使用Reader类读取文件的测试用例:

测试代码演示

package com.example.javase.io.reader;import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;/*** @author bug菌* @version 1.0* @date 2023/10/19 10:34*/
public class ReaderTest {public static void main(String[] args) throws IOException {File file = new File("./template/fileTest.txt");Reader reader = new FileReader(file);char[] buffer = new char[1024];int len;while ((len = reader.read(buffer)) != -1) {System.out.println(new String(buffer, 0, len));}reader.close();}
}

测试结果展示

  根据如上测试用例,我们来执行下main主函数进行测试读取文件的字符数据,结果展示如下截图:

在这里插入图片描述

  通过控制台输出的内容与原文本内容进行对比,可得该测试用例运用Reader类正常读取文件内容,

代码解析

  如上测试代码使用了Reader 类从文件中读取字符数据。如下来对该代码进行步骤解析,以帮助同学们加速理解。
  首先,我们先创建一个 File 对象,指定要读取的文件路径,然后使用 FileReader 类将该文件读取到内存中,并返回 Reader 对象。然后使用 char[] 数组作为缓冲区,将数据从 Reader 中读取到缓冲区,并使用 String 类将缓冲区数据转化为字符串输出到控制台,直到所有数据都被读取完毕。最后,关闭 Reader 对象释放相关资源。整个读取过程非常简单,你们学会了吗?

全文小结

  本文对Java中的Reader类进行了详细介绍,包括其简介、源代码解析、应用场景案例、优缺点分析、方法介绍及测试用例。通过本文的学习,我们可以更好地掌握Reader的使用方法,并在开发中合理使用Reader类。

总结

  Reader类是Java中一个用于读取字符流的抽象类,它具有读取文本数据、自动处理字符编码等优点,并可通过其子类实现不同的功能。但是,Reader类读取数据的速度较慢,不适合读取二进制数据,而且不能随机访问文件中的数据。在使用Reader类时,要注意使用缓冲区等方式来提高读取速度和效率。最后,要注意关闭资源,避免资源泄漏问题的发生。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

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

相关文章

回归预测 | Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-HKELM冠豪猪算法优化混合核极限学习机…

我耀学IT—day03-徽章及进度条

一、Bootstrap5 信息提示框 Bootstrap 5 可以很容易实现信息提示框。 提示框可以使用 .alert 类, 后面加上 .alert-success, .alert-info, .alert-warning, .alert-danger, .alert-primary, .alert-secondary, .alert-light 或 .alert-dark 类来实现: 例: <div class&quo…

IO进程线程复习:进程线程

1.进程的创建 #include<myhead.h>int main(int argc, const char *argv[]) {printf("hello world\n");//父进程执行的内容int num520;//在父进程中定义的变量pid_t pidfork();//创建子进程if(pid>0){while(1){printf("我是父进程&#xff0c;num%d\n&…

[第一章 web入门]SQL注入-1 题目分析与详解

一、题目简介&#xff1a; 题目来源&#xff1a;BUUCTF网址 题目介绍如图&#xff1a;获取flag值。 二、解题思路&#xff1a; 首先看到题目主页面有一段文字&#xff0c;貌似没有什么作用&#xff0c;我们先使用HackBar导入URL。 我们发现?id1&#xff0c;可知这是一个很基…

小猫咪不喝水怎么办?主食冻干、主食罐头喂养从饮食上给猫咪补水

小猫咪不喝水怎么办&#xff1f;它们会不会在感到口渴、缺水时自己去寻找水喝呢&#xff1f;猫的祖先是来自沙漠的猫科动物&#xff0c;在沙漠几乎找不到水源&#xff0c;因此它们进化出了“低渴感”&#xff0c;并且它们的肾脏进化出了浓缩水分再吸收的功能&#xff0c;使得猫…

安全测试工具之nmap使用指南

文章目录 一、前言二、简介三、使用示例&#xff08;一&#xff09;常用命令&#xff08;二&#xff09;主机存活检测&#xff08;三&#xff09;端口探测&#xff08;四&#xff09;服务识别&#xff08;五&#xff09;操作系统识别 三、其它 一、前言 当我们在构建环境或排查…

怎么使用Python轻松打造淘宝主图视频生成神器

目录 一、引言 二、淘宝主图视频的重要性 三、Python打造淘宝主图视频生成神器的步骤 1. 准备工作 2. 收集素材 3. 制作视频 4. 调整和优化 5. 上传至淘宝 四、案例分享 五、总结 一、引言 随着电子商务的飞速发展&#xff0c;淘宝作为中国最大的网络购物平台之一&am…

【非递归版】归并排序算法(2)

目录 MergeSortNonR归并排序 非递归&归并排序VS快速排序 整体思想 图解分析​ 代码实现 时间复杂度 归并排序在硬盘上的应用&#xff08;外排序&#xff09; MergeSortNonR归并排序 前面的快速排序的非递归实现&#xff0c;我们借助栈实现。这里我们能否也借助栈去…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

一款.NET下 WPF UI框架介绍

WPF开源的UI框架有很多,如HandyControl、MahApps.Metro、Xceed Extended WPF Toolkit™、Modern UI for WPF (MUI)、Layui-WPF、MaterialDesignInXamlToolkit、等等&#xff0c;今天小编带大家认识一款比较常用的kaiyuanUI---WPF UI&#xff0c;这款ui框架美观现代化&#xff0…

使用单一ASM-HEMT模型实现从X波段到Ka波段精确的GaN HEMT非线性仿真

来源&#xff1a;Accurate Nonlinear GaN HEMT Simulations from X- to Ka-Band using a Single ASM-HEMT Model 摘要&#xff1a;本文首次研究了ASM-HEMT模型在宽频带范围内的大信号准确性。在10、20和30 GHz的频率下&#xff0c;通过测量和模拟功率扫描进行了比较。在相同的频…

端口映射教程?

端口映射是一种网络技术&#xff0c;用于在公网与内网之间建立网络连接。在互联网中&#xff0c;设备通过IP地址和端口号进行通信&#xff0c;而内网中的设备通常被分配了私有IP地址&#xff0c;无法直接被公网访问。端口映射可以将公网的请求转发到内网中的设备&#xff0c;从…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

汇总利用YOLO8训练遇到的报错和解决方案(包含训练过程中验证阶段报错、精度报错、损失为Nan、不打印GFLOPs)

一、本文介绍 本文为专栏内读者和我个人在训练YOLOv8时遇到的各种错误解决方案,你遇到的问题本文基本上都能够解决,同时本文的内容为持续更新,定期汇总大家遇到的问题已经一些常见的问题答案,目前包含的问题已经解决方法汇总如下图所示。 专栏目录:YOLOv8改进有效系列目录…

机器人内部传感器阅读笔记及心得-位置传感器-旋转变压器、激光干涉式编码器

旋转变压器 旋转变压器是一种输出电压随转角变化的检测装置&#xff0c;是用来检测角位移的&#xff0c;其基本结构与交流绕线式异步电动机相似&#xff0c;由定子和转子组成。 旋转变压器的原理如图1所示&#xff0c;定子相当于变压器的一次侧&#xff0c;有两组在空间位置上…

Python及Pycharm专业版下载安装教程(Python 3.11版)附JetBrains学生认证教程

目录 一、Python下载及安装1、Python下载2、Python安装3、验证是否安装成功 二、PyCharm下载及安装1、PyCharm下载2、PyCharm安装3、激活PyCharm 三、JetBrains学生认证 本篇主要介绍Python和PyCharm专业版的下载及安装方式&#xff0c;以及通过两种方式进行JetBrains学生认证。…

CAS5.3使用JPA实现动态注册服务

cas同时支持cas协议和OAuth2协议,官方默认是通过扫描json文件的形式注册客户端服务,但是此种方式需要重启服务才能生效,此次我们将使用JPA来完美实现动态注册服务,如果不知道cas如何部署,可以擦看之前的文章 cas-client基于CAS协议客户端搭建-CSDN博客 cas-server5.3自定义密…

家用超声波清洗机哪个好?四款高评分超声波清洗机分享

超声波清洗机可以说是眼镜党家中必备的一款超声波清洗机&#xff0c;毕竟它能高效的帮我们解决清洗眼镜的烦恼&#xff0c;也可以帮我们清洗家中其他的一些物品。很多朋友因为各种原因没有时间清洗眼镜以及家中的小物件物品&#xff0c;长时间下来一次物品或者是眼镜上就会堆积…

构建高效稳定的外卖平台架构设计与实现

外卖行业的快速发展为人们的生活带来了便利&#xff0c;随着外卖市场的扩大和竞争的加剧&#xff0c;外卖平台的架构设计变得至关重要。一个高效稳定的架构可以支持平台的快速发展&#xff0c;提供优质的服务体验&#xff0c;同时保障用户数据的安全性。 用户端架构设计 移动端…

【C#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…