Reader类的使用方法和技巧,你掌握了吗?

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在Java开发中,常常需要读取文件或者网络流等数据源,Reader类提供了一种方便的方式去读取字符流。本文将介绍Java中Reader类的详细用法和应用场景。

摘要

Reader类是一个抽象类,是所有字符输入流的超类,提供了基本的读取字符流的方法。Reader类还提供了许多实用的子类,例如InputStreamReader和FileReader。它们可以读取字节流并将其转换为字符流。本文主要介绍Reader类的基本使用和源代码解析,并给出一些应用场景案例和优缺点分析。

Reader类

简介

Reader类是Java IO API中的一个重要组成部分,是一个抽象类,用于读取字符流。它提供了多种方法,可以方便地读取字符流。Reader类继承了java.lang.Object类,实现了Closeable和Readable接口,其中Closeable接口表示一个可关闭的资源,Readable接口表示可以读取的资源。

Reader类的主要作用是从外部数据源中读取字符流,并将其提供给应用程序。在读取字符流的过程中,Reader类提供了一些实用的方法,例如read()、skip()等,这些方法可以用于读取和跳过字符流中的数据。同时,Reader类还提供了一些高级的方法,例如mark()、reset()等,这些方法可以用于标记和重置读取位置。

源代码解析

Reader类的主要源代码如下:

public abstract class Reader implements Readable, Closeable {//...public int read(CharBuffer target) throws IOException {int len = target.remaining();char[] cbuf = new char[len];int n = read(cbuf, 0, len);if (n > 0) {target.put(cbuf, 0, n);}return n;}public int read() throws IOException {char[] cb = new char[1];if (read(cb, 0, 1) == -1) {return -1;}return cb[0];}public int read(char cbuf[], int off, int len) throws IOException {//...}public long skip(long n) throws IOException {//...}public boolean ready() throws IOException {//...}public boolean markSupported() {return false;}public void mark(int readAheadLimit) throws IOException {throw new IOException("mark() not supported");}public void reset() throws IOException {throw new IOException("mark() not supported");}public abstract void close() throws IOException;//...
}

可以看到,Reader类提供了一些基本的方法,例如read()、skip()等,它们被所有子类所继承。同时,Reader类也提供了一些高级的方法,例如mark()、reset()等,这些方法需要子类自己去实现。在具体实现时,子类还需要覆盖Reader类中的抽象方法,例如read(char[] cbuf, int off, int len)等。

该代码展示了Reader类的一些主要方法,它是一个抽象类,实现了ReadableCloseable接口。其中,Reader类的主要作用是从输入流中读取字符或者字符数组,并提供了一些方法来管理输入流。

  1. read(CharBuffer target)方法:该方法将字符读入到指定的字符缓冲区中,返回读入的字符数。它内部实现调用了read(char cbuf[], int off, int len)方法,将读取到的字符放入到指定的字符缓冲区中。

  2. read()方法:该方法从输入流中读取一个字符,返回读入的字符的ASCII码值。它内部实现是调用了read(char cbuf[], int off, int len)方法读取字符,并将读入的字符转换为对应的ASCII码值返回。

  3. read(char cbuf[], int off, int len)方法:该方法从输入流中读取字符到指定的字符数组中。其中,off表示字符数组的起始偏移量,len表示将要读取的字符数。该方法返回实际读取的字符数,如果已到达文件结尾,返回-1。

  4. skip(long n)方法:该方法从输入流中跳过n个字符,返回实际跳过的字符数。如果n小于或等于0,则不执行任何操作,直接返回0。

  5. ready()方法:该方法判断输入流是否可以读取,如果可以则返回true,否则返回false。

  6. markSupported()方法:该方法判断该输入流是否支持标记和重新定位操作。由于Reader类的实现不支持标记和重新定位操作,因此该方法返回false。

  7. mark(int readAheadLimit)reset()方法:这两个方法都会抛出IOException异常,因为Reader类的实现不支持标记和重新定位操作。

  8. close()方法:该方法关闭输入流并释放与其相关的所有资源,如果输入流已经关闭,则不执行任何操作。

  如下是部分源码截图:

在这里插入图片描述

应用场景案例

  1. 从文件中读取数据
try (Reader reader = new FileReader("file.txt")) {int data = reader.read();while (data != -1) {System.out.print((char) data);data = reader.read();}
} catch (IOException e) {e.printStackTrace();
}
  1. 从网络中读取数据
try (Reader reader = new InputStreamReader(new URL("https://www.example.com").openStream())) {int data = reader.read();while (data != -1) {System.out.print((char) data);data = reader.read();}
} catch (IOException e) {e.printStackTrace();
}
  1. 从标准输入中读取数据
try (Reader reader = new InputStreamReader(System.in)) {int data = reader.read();while (data != -1) {System.out.print((char) data);data = reader.read();}
} catch (IOException e) {e.printStackTrace();
}

优缺点分析

优点

  • Reader类提供了一种方便的方式去读取字符流。
  • Reader类提供了多种实用的方法,例如read()、skip()等,可以方便地读取和跳过字符流中的数据。
  • Reader类提供了一些高级的方法,例如mark()、reset()等,可以用于标记和重置读取位置。

缺点

  • Reader类不能直接读取字节流,需要使用它的子类或者转换流来实现。
  • Reader类的read()方法是阻塞的,如果数据源中没有更多的数据,程序将会处于阻塞状态。

类代码方法介绍

  1. read()方法
public abstract int read() throws IOException;

该方法用于读取一个字符,返回值为字符的整数表示形式,如果到达文件末尾,则返回-1。

  1. read(char[] cbuf, int off, int len)方法
public int read(char cbuf[], int off, int len) throws IOException

该方法从字符流中读取len个字符,并将其存储在cbuf数组中,起始位置为off。返回值为实际读取的字符数,如果到达文件末尾,则返回-1。

  1. skip(long n)方法
public long skip(long n) throws IOException

该方法跳过n个字符,返回值为实际跳过的字符数。

  1. ready()方法
public boolean ready() throws IOException;

该方法返回是否可以立即从该输入流中读取数据。

  1. markSupported()方法
public boolean markSupported()

该方法返回是否支持标记操作。

  1. mark(int readAheadLimit)方法
public void mark(int readAheadLimit) throws IOException

该方法将当前读取位置标记为readAheadLimit,可以使用reset()方法以后返回该位置。该方法需要子类自己去实现。

  1. reset()方法
public void reset() throws IOException

该方法将读取位置重置为上一次调用mark()方法时的位置。该方法需要子类自己去实现。

  1. close()方法
public abstract void close() throws IOException;

该方法关闭输入流并释放与之关联的所有系统资源。

测试用例

测试代码演示

Reader类的单元测试用例如下:

package com.example.javase.se.classes;import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;/*** @Author ms* @Date 2023-11-04 18:32*/
public class ReaderTest {public static void main(String[] args) {Reader reader = null;try {reader = new StringReader("Hello World!");StringBuilder result = new StringBuilder();int data = reader.read();while (data != -1) {result.append((char) data);data = reader.read();}reader.mark(3);char[] buffer = new char[5];reader.read(buffer, 0, 5);assert new String(buffer).equals("Hello");reader.reset();buffer = new char[7];reader.read(buffer, 0, 7);System.out.println("new String(buffer) : " + buffer);} catch (IOException e) {e.printStackTrace();} finally {try {if (reader != null) {reader.close();}} catch (IOException e) {e.printStackTrace();}}}
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

该代码演示了如何使用Java中的Reader类,主要包括以下内容:

  1. 创建一个StringReader对象,该对象将字符串“Hello World!”封装为一个Reader对象。

  2. 创建一个StringBuilder对象,逐个读取StringReader中的字符,并将其添加到StringBuilder对象中。

  3. 使用Reader类的mark()方法和reset()方法,实现标记和重置Reader对象位置的功能。

  4. 创建一个字符数组,使用Reader类的read()方法将部分字符读入该数组中,并将其转换为字符串。

  5. 最后,关闭Reader对象。

总之,该代码演示了如何使用Java中的Reader类读取字符流并进行基本操作,包括标记和重置流的位置以及选择性读取部分字符。
… …

总结

本文介绍了Java中的字符流读取类——Reader类。作为一个抽象类,Reader类提供了多种方法,可以便捷地读取字符流。本文对Reader类的基本概念及其应用场景进行了介绍,并详细解析了其源代码。同时,本文也分析了Reader类的优缺点,提醒读者在使用时需要注意其阻塞问题和不能直接读取字节流等特性。最后,本文还提出了Reader类的单元测试用例。整体而言,掌握Reader类的基本用法对Java开发人员来说非常重要。

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/333673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode中使用conda虚拟环境

每一次配置环境,真的巨烦,网上的资料一堆还得一个个尝试,遂进行整理 1.准备安装好Anaconda 附带一篇测试教程,安装anaconda 2.准备安装vscode 安装地址:Visual Studio Code 3.创建Conda环境 搜索框搜索Anaconda…

音视频及H264/H256编码相关原理

一、音视频封装格式原理: 我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…

香橙派OrangePi AIpro上手初体验

一、前言 非常感谢能够收到CSDN和香橙派的OrangePi AIpro开发板评测活动的邀请;收到的OrangePi AIpro实物如下所示: 二、OrangePi AIpro介绍 通过查询香橙派官网可以了解到OrangePi AIpro的相关信息如下:OrangePi AIPro 开发板是香橙派联合…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中,如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收? 问题描述 在postman中测试接口,报错Error:Abort,或者显示返回数据校验失…

C++入门——日期类的实现

前言 生活中,我们时不时会遇到算天数的问题:高考倒计时、考研倒计时、过年倒计时...... 想解决这些问题无非就是实现一个年月日的计算器,那要怎么来实现呢? 下面就让我们来探究一下。 1.了解日期计算器的需求 1.1 表面需求 …

Tailwind CSS快速入门

文章目录 初识安装Tailwindcss试用安装快速书写技巧扩展好处Todo 初识 只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站 Tailwind CSS 是一个功能类优先的 CSS 框架,它通过提供大量的原子类(utility classes)…

FTP协议——LightFTP安装(Linux)

1、简介 LightFTP是一个轻量级的FTP(File Transfer Protocol,文件传输协议)客户端软件。FTP是一种用于在网络上传输文件的标准协议,允许用户通过TCP/IP网络(如互联网)在计算机之间进行文件传输。 2、步骤…

APM2.8下载固件的方法(两种办法详解)

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口,不要选择auto,如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意:烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

常用时序逻辑电路模块:移位寄存器

寄存器与移位寄存器 寄存器:数字系统中用来存储二进制数据的逻辑器件。存储N位二进制数据的寄存器需要N个触发器组成。 移位功能:存储代码在脉冲作用下依次左移或右移。 移位寄存器: 移位寄存器中的数据可以在移位脉冲作用下依次逐位右移…

Vue3_创建项目

目录 一、创建vue项目 1.下载vue 2.进入刚才创建的项目 3.安装依赖 4.运行项目 ​5.打包项目放入生产环境 二、vue项目组成 1.项目文件结构 2.项目重要文件 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、C…

unity制作app(9)--拍照 相册 上传照片

1.传输照片(任何较大的数据)都需要扩展服务器的内存空间。 2.还需要base64编码 2.1客户端发送位置的编码 2.2服务器接收部分的代码

Visual Studio中调试信息格式参数:/Z7、/Zi、/ZI参数

一般的调试信息都保存在pdb文件中。 Z7参数表示这些调试信息保存到OBJ目标文件中,这样的好处是不需要单独分发PDB文件给下游。Zi就是把所有的调试信息都保存在pdb文件中,以缩小发布文件的大小。ZI和Zi类似,但是增加了热重载的能力&#xff1…

数据库|基于T-SQL向数据库数据表中添加、修改、删除数据

哈喽,你好啊,我是雷工! 前边学习了基于T-SQL创建数据库和创建数据表, 《数据库|基于T-SQL创建数据库》 《数据库|基于T-SQL创建数据表》 接下来学习向创建好的数据表中添加数据,以下为学习笔记。 01 通过T-SQL向数据表…

1.5.3 基于Java配置方式使用Spring MVC

本实战教程主要介绍了如何使用Java配置方式来使用Spring MVC框架。相较于XML配置方式,Java配置方式提供了一种更为简洁和灵活的配置方法。 项目创建与配置 创建一个Jakarta EE项目,并设置项目名称和位置。选择Jakarta EE 10版本,不添加依赖&a…

【StableDiffusion】SD1.4、1.5、2.0、2.1 和 SDXL0.9-1.0、SDXL turbo 等的区别

总览 1.基础sd base model家族:SD1.4、SD1.5、SD1.5-LCM、SD2.0、SD2.0-768、SD2.1、SD2.1-768、SD2.1-UNCLIP 2.升级sdxl base model家族:SDXL0.9、SDXL1.0、SDXL1.0-LCM、SDXL-DISTILLED、SDXL-TURBO 3.专门用于视频生成的 SVD 家族:SVD、…

鸿蒙知识点总结

1 Stage模型应用程序包结构 在开发态,一个应用包含一个或者多个Module,可以在DevEco Studio工程中创建一个或者多个Module。Module是HarmonyOS应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一…

华为CE6851-48S6Q-HI升级设备版本及补丁

文章目录 升级前准备工作笔记本和交换机设备配置互联地址启用FTP设备访问FTP设备升级系统版本及补丁 升级前准备工作 使用MobaXterm远程工具连接设备,并作为FTP服务器准备升级所需的版本文件及补丁文件 笔记本和交换机设备配置互联地址 在交换机接口配置IP&#…

[AIGC] Java常用的JSON库及简单示例

Java常用的JSON库及简单示例 在Java的世界里,JSON库广泛用于日常开发工作,本文将介绍几个常用的JSON库并配以简单的示例代码。 1. Gson Gson是Google提供的一个用来在Java对象和JSON数据之间进行转换的Java库。 它有一定的学习曲线,但一旦熟…

财务RPA机器人如何使用

随着科技的不断发展,自动化技术在各个领域得到了广泛应用,在财务领域,RPA机器人已经成为一种新兴的技术手段,帮助众多企业实现了财务流程的自动化,大大提高了工作效率,降低人力成本。 本文金智维将详细介绍…

move base全解

0. 简介 之前我们专门有一节讲到了《move_base源码学习》。主要介绍了MoveBase基类中函数的大概意思以及调用的方式。move_base是ROS下关于机器人路径规划的中心枢纽。它通过订阅激光雷达、map地图、amcl的定位等数据,然后规划出全局和局部路径,再将路径…