本文分享自华为云社区《深入理解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」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

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

一步步带你剖析Java中的Reader类的更多相关文章

  1. 深入剖析Java中的装箱和拆箱

    深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...

  2. 从别人那淘的知识 深入剖析Java中的装箱和拆箱

    (转载的海子的博文   海子:http://www.cnblogs.com/dolphin0520/) 深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来 ...

  3. 深入剖析Java中的自动装箱和拆箱过程

    深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...

  4. [ 转载 ]学习笔记-深入剖析Java中的装箱和拆箱

    深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...

  5. 【转】深入剖析Java中的装箱和拆箱

    深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...

  6. 深度剖析java中JDK动态代理机制

    https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...

  7. (转)深入剖析Java中的装箱和拆箱

    转:https://www.cnblogs.com/dolphin0520/p/3780005.html 深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就 ...

  8. java基础(七)-----深入剖析Java中的装箱和拆箱

    本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...

  9. java中普通的顶级类是不能使用static关键字修饰的。只有内部类可以使用static修饰,也可以不使用staitc关键字修饰。

    java中普通的顶级类是不能使用static关键字修饰的.只有内部类可以使用static修饰,也可以不使用staitc关键字修饰. java中的类可以是static吗?答案是可以.在java中我们可以 ...

  10. 带有静态方法的类(java中的math类)

    带有静态方法的类通常(虽然不一定是这样)不打算被初始化. 可以用私有构造函数来限制非抽象类被初始化. 例如,java中的math类.它让构造函数标记为私有,所以你无法创建Math的实例.但Math类却 ...

随机推荐

  1. n皇后问题的分析和实现

    N皇后问题的分析和实现 1.实现要求 2.代码实现 1.实现要求 在n*n的方格棋中,放置n个皇后,要求每个皇后不同行,不同列,不同对角线 以行为依据,遍历行,判断行对应的列是否符合要求 判定要求: ...

  2. CentOS 7 搭建NFS服务器

    服务端安装 # 创建挂载目录 cd ~ cd data/ mkdir www-content cd www-content/ pwd # 安装软件 yum install nfs-utils yum ...

  3. ZIM|一站式接入,打通 RTC 和 IM 组合拳

    从用户信息.用户心跳到用户间私人与聊天室通信,IM 一直是互联网世界中不可或缺的基础建设之一.早在连麦和直播诞生之前,IM 就已是在通讯领域内服役多年的老兵,而随着线上音视频的兴起,IM 不仅没有没落 ...

  4. Ubuntu 20.04使用 VNC远程桌面连接避坑指南

    Ubuntu 20.04使用 VNC远程桌面连接避坑指南 自从开始使用Ubuntu 20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用.可是之前一直使用的是Ubuntu18.04,心里想着 ...

  5. UE构建基础和实践:五、CI/CD平台自动化打包

    序言 使用CI/CD平台构建(这里使用蓝盾平台)主要是通过平台脚本运行上一章的py脚本并传递参数(即把py中的参数开放给配置平台脚本配置). Build.py 重构 我们需要在py脚本里面解析和设置参 ...

  6. IOS App内嵌H5 swiper 轮播出现卡顿白屏闪烁

    话说在前头:前端开发同学遇到这个问题不慌,因为接下来你要踩的坑我都帮你们踩完了,所以有了这一篇博客.希望能帮到你 轮播组件:swiper@4.5.1 (4x稳定的最后一个版本) 设备:ios版本15x ...

  7. Java 日志系列:JUL 使用和原理分析

    目录 一. 简介 二.使用 三.日志级别 四.Logger 继承关系 五.配置文件 六.原理解析 一. 简介 JUL 全称 Java util Logging 是 java 原生的日志框架,使用时不需 ...

  8. 9.1 C++ STL 排序、算数与集合

    C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法.在STL中,排序.算数和集合算法是常用的 ...

  9. 数据库中limit 和 offset 使用区别

    题:查找最晚入职员工的所有信息 1,SELECT * FROM employees ORDER BY hire_date DESC LIMIT 0,1; 解:对列hire_date分组后升序,从下标( ...

  10. Linux-源码安装软件

    一.源码安装步骤 源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). 1.配置(configure) Configure是一个可执行脚本,它 ...