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

打印 上一主题 下一主题

主题 853|帖子 853|积分 2559

本文分享自华为云社区《深入理解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类是一个抽象类,它的源代码定义如下:
  1. public abstract class Reader implements Readable, Closeable {
  2.     ...
  3. }
复制代码
其中,Reader实现了两个接口:Readable和Closeable。Readable接口中只定义了一个方法:
  1. public interface Readable {
  2.     int read(CharBuffer cb) throws IOException;
  3. }
复制代码
而Closeable接口中也只定义了一个方法:
  1. public interface Closeable extends AutoCloseable {
  2.     void close() throws IOException;
  3. }
复制代码
这两个接口的作用分别是提供读取字符和关闭资源的方法。
应用场景案例

Reader类通常用于读取文本文件中的数据。比如我们经常使用的BufferedReader就是Reader类的一个子类,用于逐行读取文本文件中的数据。除此之外,Reader还可用于读取网络数据、读取控制台输入等场景。
下面是几个 使用Reader 类的应用场景案例,同学们仅供参考:
1. 读取文本文件

使用 FileReader 类来读取文本文件很常见。例如可以使用 FileReader 和 BufferedReader 组合来读取一个文本文件并逐行输出:
  1.     //1. 读取文本文件
  2.     public static void testReadFile(){
  3.         FileReader fileReader;
  4.         BufferedReader bufferedReader;
  5.         try {
  6.             fileReader = new FileReader("./template/fileTest.txt");
  7.             bufferedReader = new BufferedReader(fileReader);
  8.             String line;
  9.             while ((line = bufferedReader.readLine()) != null) {
  10.                 System.out.println(line);
  11.             }
  12.             fileReader.close();
  13.             bufferedReader.close();
  14.         } catch (IOException e) {
  15.             e.printStackTrace();
  16.         }
  17.     }
复制代码
通过上述案例,我们本地演示,结果可见如下:

2. 读取网络资源

可以使用 InputStreamReader 和 URL 类来读取网络资源,例如:
  1.     //2. 读取网络资源
  2.     public static void testReadURL() throws IOException {
  3.         URL url = new URL("https://www.baidu.com/");
  4.         URLConnection conn = url.openConnection();
  5.         InputStream is = conn.getInputStream();
  6.         InputStreamReader isr = new InputStreamReader(is);
  7.         BufferedReader br = new BufferedReader(isr);
  8.         String line;
  9.         while ((line = br.readLine()) != null) {
  10.             System.out.println(line);
  11.         }
  12.         br.close();
  13.         isr.close();
  14.         is.close();
  15.     }
  16.     public static void main(String[] args) throws IOException {
  17.         testReadURL();
  18.     }
复制代码
通过上述案例,我们本地演示,结果可见如下:

3. 读取字符串

可以使用 StringReader 类来将一个字符串转换为字符流,例如:
  1.     //3. 读取字符串
  2.     public static void testReadStr() throws IOException {
  3.         String str = "Hello, World!!!";
  4.         StringReader stringReader = new StringReader(str);
  5.         int data;
  6.         while ((data = stringReader.read()) != -1) {
  7.             System.out.print((char) data);
  8.         }
  9.         stringReader.close();
  10.     }
  11.     public static void main(String[] args) throws IOException {
  12.         testReadStr();
  13.     }
复制代码
通过上述案例,我们本地演示,结果可见如下:

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

优点


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


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

构造方法
  1. protected Reader()
复制代码
Reader类的默认构造方法。
方法
  1. public int read() throws IOException
复制代码
用处:读取单个字符,并返回该字符的ASCII码,如果到达流的末尾,返回-1。
  1. public int read(char[] cbuf) throws IOException
复制代码
用处:读取字符数组,返回读取的字符个数。
  1. public int read(char[] cbuf, int offset, int length) throws IOException
复制代码
用处:读取指定长度的字符数组,返回读取的字符个数。
  1. public long skip(long n) throws IOException
复制代码
用处:跳过n个字符(包括空格),返回实际跳过的字符数。
  1. public boolean ready() throws IOException
复制代码
用处:判断是否可以从流中读取字符,如果可以读取返回true。
  1. public boolean markSupported()
复制代码
用处:判断此流是否支持mark()操作。如果支持,则返回true,否则返回false。
  1. public void mark(int readAheadLimit) throws IOException
复制代码
用处:设置mark位置,并将输入流中的指针指向mark位置。如果该流不支持mark()操作,则抛出IOException异常。
  1. public void reset() throws IOException
复制代码
用处:将输入流中的指针重新指向mark位置。如果该流不支持reset()操作,则抛出IOException异常。
  1. abstract public void close() throws IOException
复制代码
用处:关闭该流并释放与之关联的所有资源。
测试用例

以下是一个使用Reader类读取文件的测试用例:
测试代码演示
  1. package com.example.javase.io.reader;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.io.Reader;
  6. /**
  7. * @author bug菌
  8. * @version 1.0
  9. * @date 2023/10/19 10:34
  10. */
  11. public class ReaderTest {
  12.     public static void main(String[] args) throws IOException {
  13.         File file = new File("./template/fileTest.txt");
  14.         Reader reader = new FileReader(file);
  15.         char[] buffer = new char[1024];
  16.         int len;
  17.         while ((len = reader.read(buffer)) != -1) {
  18.             System.out.println(new String(buffer, 0, len));
  19.         }
  20.         reader.close();
  21.     }
  22. }
复制代码
测试结果展示

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

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

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

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

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

如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
点击关注,第一时间了解华为云新鲜技术~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表