一步步带你剖析Java中的Reader类
本文分享自华为云社区《深入理解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类是一个抽象类,它的源代码定义如下:
public abstract class Reader implements Readable, Closeable {
...
}
其中,Reader实现了两个接口:Readable和Closeable。Readable接口中只定义了一个方法:
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 类的子类,可以方便地读取各种类型的字符流数据。如果你还有更多贴切生活或工作中的案例,欢迎评论区交流呀,独乐乐不如众乐乐。
利弊分析
优点
Reader类支持字符流的读取,可以准确地读取文本文件中的数据。Reader类能够自动处理字符编码问题,在读取文件时能够自动转换编码方式。- 可以通过
Reader类的各个子类实现不同的功能,使用灵活。
缺点
Reader类读取数据的速度较慢,不适合读取二进制数据。Reader类不能随机访问文件中的数据,只能逐行读取,读取大文件时效率较低。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类的更多相关文章
- 深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- 从别人那淘的知识 深入剖析Java中的装箱和拆箱
(转载的海子的博文 海子:http://www.cnblogs.com/dolphin0520/) 深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来 ...
- 深入剖析Java中的自动装箱和拆箱过程
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- [ 转载 ]学习笔记-深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- 【转】深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱 ...
- 深度剖析java中JDK动态代理机制
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
- (转)深入剖析Java中的装箱和拆箱
转:https://www.cnblogs.com/dolphin0520/p/3780005.html 深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就 ...
- java基础(七)-----深入剖析Java中的装箱和拆箱
本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...
- java中普通的顶级类是不能使用static关键字修饰的。只有内部类可以使用static修饰,也可以不使用staitc关键字修饰。
java中普通的顶级类是不能使用static关键字修饰的.只有内部类可以使用static修饰,也可以不使用staitc关键字修饰. java中的类可以是static吗?答案是可以.在java中我们可以 ...
- 带有静态方法的类(java中的math类)
带有静态方法的类通常(虽然不一定是这样)不打算被初始化. 可以用私有构造函数来限制非抽象类被初始化. 例如,java中的math类.它让构造函数标记为私有,所以你无法创建Math的实例.但Math类却 ...
随机推荐
- asp.net core之Startup
Startup介绍 Startup是Asp.net Core的应用启动入口.在.NET5及之前一般会使用startup.cs类进行程序初始化构造.如下: public class Startup { ...
- Angular:error TS2717: Subsequent property declarations must have the same type. Property 'contentRect' mu st be of type 'DOMRectReadOnly', but here has type 'DOMRectReadOnly'.
解决方案 在tsconfig.json的compilerOptions选项中添加如下内容"skipLibCheck": true. 如下图所示 之后重新启动项目. 如下图启动成功
- 若依前后端分离版:增加新的登录接口和新的用户表,用于小程序或者APP获取token,并使用若依的验证方法
相关原创链接直接放这: 基于若依框架springsecurity添加多种用户登录解决方案(springsecurity多用户登录:前端用户.后端用户)_若依多用户表登录_云优的博客-CSDN博客 若依 ...
- 王道oj/problem18
网址:略 思路:见注释:有bug:插入时1和2的结果正好相反,稍后编辑. 代码: #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#incl ...
- Redis从入门到放弃(6):持久化
1.引言 Redis作为一种高性能的内存数据存储系统,常被用作缓存.会话存储.消息队列等多种应用场景.然而,由于其数据存储在内存中,一旦发生意外或服务器重启,数据就会丢失.为了保障数据的持久性和安全性 ...
- 用React仿钉钉审批流
引言 这几天帮朋友忙,用了一周时间,高仿了一个钉钉审批流.这个东西会有不少朋友有类似需求,就分享出来,希望能有所帮助.为了方便朋友的使用,设计制作的时候,尽量做到节点配置可定制,减少集成成本.如果您的 ...
- 角度新奇!第一次看到这样使用MyBatis的,看得我一愣一愣的。
你好呀,我是歪歪. 这期给大家分享一个读者给我分享的一个关于 MyBatis 的"编程小技巧",说真的,这骚操作,直接把我看得一愣一愣的. 我更情愿叫它:坑你没商量之埋雷大法. D ...
- Win11和Win10怎么禁用驱动程序强制签名? 关闭Windows系统驱动强制签名的技巧?
前言 什么是驱动程序签名? 驱动程序签名又叫做驱动程序的数字签名,它是由微软的Windows硬件设备质量实验室完成的.硬件开发商将自己的硬件设备和相应的驱动程序交给该实验室,由实验室对其进行测试,测试 ...
- WPF-实现屏幕截图(一)
源码路径:https://gitee.com/LiuShuiRuoBing/wpf_screen_cut 实现功能 实现基本的截屏窗体 鼠标随意选择截图区域 鼠标抬起时弹出按钮区 快捷键Ctrl+Al ...
- 细谈商品详情API接口设计
一.引言 随着互联网技术的发展,商品详情信息的展示和交互变得越来越重要.为了提供更好的用户体验,我们需要设计一套高效.稳定且易于扩展的商品详情API接口.本文将详细探讨商品详情API接口的设计,包括接 ...