本文分享自华为云社区《
深入理解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 classReader implements Readable, Closeable {
...
}

其中,Reader实现了两个接口:
Readable

Closeable

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

public interfaceReadable {intread(CharBuffer cb) throws IOException;
}


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

public interfaceCloseable extends AutoCloseable {voidclose() throws IOException;
}

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

应用场景案例

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

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

1. 读取文本文件

使用 FileReader 类来读取文本文件很常见。例如可以使用
FileReader

BufferedReader
组合来读取一个文本文件并逐行输出:

    //1. 读取文本文件
    public static voidtestReadFile(){
FileReader fileReader;
BufferedReader bufferedReader;
try{
fileReader
= new FileReader("./template/fileTest.txt");
bufferedReader
= newBufferedReader(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 voidtestReadURL() 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
= newBufferedReader(isr);

String line;
while ((line = br.readLine()) != null) {
System.
out.println(line);
}

br.close();
isr.close();
is.close();
}
public static voidmain(String[] args) throws IOException {
testReadURL();
}

通过上述案例,我们本地演示,结果可见如下:

3. 读取字符串

可以使用 StringReader 类来将一个字符串转换为字符流,例如:

    //3. 读取字符串
    public static voidtestReadStr() throws IOException {
String str
= "Hello, World!!!";
StringReader stringReader
= newStringReader(str);intdata;while ((data = stringReader.read()) != -1) {
System.
out.print((char) data);
}
stringReader.close();
}
public static voidmain(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 classReaderTest {public static voidmain(String[] args) throws IOException {
File file
= new File("./template/fileTest.txt");
Reader reader
= newFileReader(file);char[] buffer = new char[1024];intlen;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」
,提供给同学们一对一参考学习,辅助你更迅速的掌握。

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

标签: none

添加新评论