写点什么

一步步带你剖析 Java 中的 Reader 类

  • 2023-10-27
    广东
  • 本文字数:3554 字

    阅读完需:约 12 分钟

一步步带你剖析Java中的Reader类

本文分享自华为云社区《深入理解Java中的Reader类:一步步剖析》,作者:bug 菌。

前言


在 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 类来读取文本文件很常见。例如可以使用 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 类的子类,可以方便地读取各种类型的字符流数据。如果你还有更多贴切生活或工作中的案例,欢迎评论区交流呀,独乐乐不如众乐乐。

利弊分析

优点


  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」,提供给同学们一对一参考学习,辅助你更迅速的掌握。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
一步步带你剖析Java中的Reader类_Java_华为云开发者联盟_InfoQ写作社区