一步步带你剖析Java中的Reader类
本文分享自华为云社区《深入理解Java中的Reader类:一步步剖析》,作者:bug菌。
前言
在Java开发过程中,我们经常需要读取文件中的数据,而数据的读取需要一个合适的类进行处理。Java的IO包提供了许多类用于数据的读取和写入,其中Reader便是其中之一。本文将对Java中的Reader进行详细介绍,并分析其优缺点及应用场景。
摘要
本文将从以下几个方面对Java中的Reader
类进行详细介绍:
- Reader类的概述
- Reader类代码的解析
- Reader类的应用场景案例
- Reader类的优缺点分析
- Reader类的方法介绍及源代码分析
- Reader类的测试用例
- 全文小结和总结
- 附源码
- 建议
本文通过对Java中的Reader进行详细讲解,旨在帮助开发者更好地掌握Reader的使用方法。
Reader类
概述
Reader类是Java中用于读取字符流的抽象类。它是所有字符输入流的超类,提供了字符输入流读取时的基本功能。Reader类主要由三个类实现,分别是InputStreamReader、FileReader和CharArrayReader。
源代码解析
Reader
类是一个抽象类,它的源代码定义如下:
public abstract class Reader implements Readable, Closeable { ... }
其中,Reader实现了两个接口:Readable
和Closeable
。Readable
接口中只定义了一个方法:
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 类来读取文本文件很常见。例如可以使用 FileReader
和 BufferedReader
组合来读取一个文本文件并逐行输出:
//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 类的子类,可以方便地读取各种类型的字符流数据。如果你还有更多贴切生活或工作中的案例,欢迎评论区交流呀,独乐乐不如众乐乐。
利弊分析
优点
Reader
类支持字符流的读取,可以准确地读取文本文件中的数据。Reader
类能够自动处理字符编码问题,在读取文件时能够自动转换编码方式。- 可以通过
Reader
类的各个子类实现不同的功能,使用灵活。
缺点
Reader
类读取数据的速度较慢,不适合读取二进制数据。Reader
类不能随机访问文件中的数据,只能逐行读取,读取大文件时效率较低。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」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《2023 年三季度互联网投融资运行情况》研究报告发布
中国信息通信研究院政策与经济研究所互联网运行分析团队于日前,发布了《2023年三季度互联网投融资运行情况》报告。 报告构建了互联网行业投融资研究框架,借助CB Insights数据库,深入挖掘我国和全球行业投融资整体态势及重点领域情况,为行业趋势预测、热点问题预判提供重要参考。 本季要点: 1.我国互联网投融资略有反弹。2023Q3,我国互联网投融资规模企稳,案例数环比下跌5.8%,同比下跌54%;披露的金额环比上涨34.7%,同比下跌36.4%。 2.全球互联网投融资继续下探。2023Q3,全球互联网投融资案例数环比下跌5.1%,同比下跌23.4%;披露的金额环比下跌15.5%,同比下跌28.8%。 3.企业服务融资占比保持领先。2023Q3,我国企业服务领域融资案例数占比25.7%,融资金额占比26%;全球企业服务领域融资案例数占比21.3%,融资金额占比19.8%。 报告全文: 报告全文下载。
- 下一篇
2023 CCF 中国开源大会开源商业化分论坛顺利召开
10 月 21 日至 22 日,由中国计算机学会(CCF)、开放原子开源基金会主办的 2023 CCF 中国开源大会在长沙顺利举行。其中,开源商业化分论坛由开源中国承办,开源中国董事长马越担任主席。来自开源原生商业公司的诸多专家就开源项目商业化最佳实践展开分享,为更多开发者和企业提供可借鉴的经验,共同推动开源生态建设,助力开源生态发展。 开源中国董事长马越以《中国开源商业发展的现状及思考》为题发表主旨演讲。他指出,当前开源创业公司有“七大恨”:没有品牌、没有流量、没有销售能力、没有资质、没有交付能力、没有现金流、没有资本渠道。这些都严重阻碍了创业公司进一步发展壮大。而解决开源创业公司“七大恨”的关键就在于开源创业联合体。所谓开源创业联合体,就是提供通用服务模型的价值流平台,实现集成和自动化 IT 价值链的插件开放平台,融合市场各类开源或商业生态能力,落地客户场景服务。 最后马越提议,希望能够集众多开源力量共建这样的插件开放平台,繁荣开源商业生态,互通有无。开源中国已积累了十几年的商业化经验以及商业化能力,旗下 Gitee 平台也已经入驻了 27 万多家中小团队,服务中国 600 多家 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题