前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解Java中的Reader类:一步步剖析

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

原创
作者头像
bug菌
发布2024-02-07 08:43:51
1770
发布2024-02-07 08:43:51
举报

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

代码语言: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编程,就像滚雪球一样,越滚越大,指数级提升。

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

📣关于我

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


--End

我正在参与我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • Reader类
    • 概述
      • 源代码解析
        • 应用场景案例
          • 1. 读取文本文件
          • 2. 读取网络资源
          • 3. 读取字符串
        • 利弊分析
          • 优点
          • 缺点
        • 类代码方法介绍
          • 构造方法
          • 方法
        • 测试用例
          • 测试代码演示
          • 测试结果展示
          • 代码解析
        • 全文小结
        • 总结
        • 附录源码
        • ☀️建议/推荐你
        • 📣关于我
        相关产品与服务
        腾讯云代码分析
        腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档