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

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


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

js 复制代码
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

在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类是一个抽象类,它的源代码定义如下:

java 复制代码
public abstract class Reader implements Readable, Closeable {
    ...
}

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

java 复制代码
public interface Readable {
    int read(CharBuffer cb) throws IOException;
}

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

java 复制代码
public interface Closeable extends AutoCloseable {
    void close() throws IOException;
}

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

应用场景案例

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

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

1. 读取文本文件

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

java 复制代码
    //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 类来读取网络资源,例如:

java 复制代码
    //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 类来将一个字符串转换为字符流,例如:

java 复制代码
    //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类的使用较为繁琐,需要通过缓冲区等方式来提高读取速度和效率。

类代码方法介绍

构造方法

java 复制代码
protected Reader()

Reader类的默认构造方法。

方法

java 复制代码
public int read() throws IOException

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

java 复制代码
public int read(char[] cbuf) throws IOException

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

java 复制代码
public int read(char[] cbuf, int offset, int length) throws IOException

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

java 复制代码
public long skip(long n) throws IOException

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

java 复制代码
public boolean ready() throws IOException

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

java 复制代码
public boolean markSupported()

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

java 复制代码
public void mark(int readAheadLimit) throws IOException

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

java 复制代码
public void reset() throws IOException

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

java 复制代码
abstract public void close() throws IOException

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

测试用例

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

测试代码演示

java 复制代码
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电子书籍、简历模板等海量资料。


相关推荐
程序猿麦小七3 分钟前
基于springboot的景区网页设计与实现
java·spring boot·后端·旅游·景区
weisian15110 分钟前
认证鉴权框架SpringSecurity-2--重点组件和过滤器链篇
java·安全
蓝田~12 分钟前
SpringBoot-自定义注解,拦截器
java·spring boot·后端
theLuckyLong13 分钟前
SpringBoot后端解决跨域问题
spring boot·后端·python
.生产的驴14 分钟前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
小扳18 分钟前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
v'sir28 分钟前
POI word转pdf乱码问题处理
java·spring boot·后端·pdf·word
李少兄32 分钟前
解决Spring Boot整合Redis时的连接问题
spring boot·redis·后端
提高记忆力36 分钟前
SpringBoot整合FreeMarker生成word表格文件
java·spring
JDS_DIJ37 分钟前
RabbitMQ
java·rabbitmq·java-rabbitmq