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

news2024/12/29 1:00:16

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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.coloradmin.cn/o/1704636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

raft 协议和etcd实战

文章目录 leader选举日志复制安全性preVote 阶段preVote 投票阶段preVote阶段的作用 集群成员变更etcd raft实践etcd raft写流程时序图问题如何保障消息的幂等性,不能重复提交如何保障消息的原子性,不能提交一半raft wal日志的作用是MVCC方式的作用etcd …

瑞吉外卖项目学习笔记(一)

项目展示: 一、软件开发整体介绍 1.1 软件开发流程 作为软件开发人员,我们的主要工作是在 编码阶段 1.2 角色分工 1.3 软件环境 二、瑞吉外面项目介绍 2.1 项目介绍 系统管理后台页面: 移动端页面: 2.2 产品原型展示 产品原型是…

2024 年科技裁员综合清单

推荐阅读: 独立国家的共同财富 美国千禧一代的收入低于父辈 创造大量就业机会却毁掉了财富 这四件事是创造国家财富的关键 全球财富报告证实联盟自始至终无能 美国人已陷入无休止债务循环中,这正在耗尽他们的财务生命 2024 年,科技行业…

二分例题(D.负重越野,I.路径规划)

这两天的训练赛都有一道二分的题&#xff0c;但是都没往二分上面想&#xff0c;同样不知道怎么二分。 D. Fast and Fat 思路 二分的关键也就是check函数怎么写了&#xff0c;求队伍最大速度&#xff0c;可以分为速度>mid和<mid两部分&#xff0c;再判断&#xff0c;能不…

课时138:变量进阶_变量实践_综合案例

2.1.3 综合案例 学习目标 这一节&#xff0c;我们从 免密认证、脚本实践、小结 三个方面来学习 免密认证 案例需求 A 以主机免密码认证 连接到 远程主机B我们要做主机间免密码认证需要做三个动作1、本机生成密钥对2、对端机器使用公钥文件认证3、验证手工演示 本地主机生成…

dolphinscheduler standalone安装

官方文档&#xff1a;https://dolphinscheduler.apache.org/en-us/docs/3.1.3/guide/installation/standalone 1.安装&#xff08;以放在/home为例&#xff09; 下载见&#xff1a;https://download.csdn.net/download/taotao_guiwang/89311365 tar -xvzf apache-dolphinsche…

《中国改革报》的发行范围有哪些?

《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸&#xff0c;其发行范围广泛&#xff0c;涵盖了全国各地。 该报在全国范围内公开发行&#xff0c;读者群体包括政府部门、研究机构、企业界、学术界以及关注中国改革与发展的社会各界人士。 它通过订阅、零售等多…

力扣hot100学习记录(十)

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题意 将两个有序列表合并 思路 用两个指针分别指向两个链表最开始&#xff0c;每次把较小的拿出来&#xff0c;相应指针后移&#xff0c;直到一个链表…

Java 多线程(01)

运行一个 Java 程序就是跑一个 Java 进程&#xff0c;该进程至少有一个线程即主线程&#xff0c;而 main 方法就是主线程的入口&#xff1b; 一、常见多线程名词解释 并发&#xff1a;一个 CPU 核心上&#xff0c;通过快速轮转调度的方式&#xff0c;执行多个进程&#xff0c…

linux文件编程api: creat

1.基本信息 功能 创建新文件 头文件 #include<fcntl.h> 函数形式 int creat(const char *pathname, mode_t mode); 返回值 如果成功&#xff0c;则返回文件描述符号 如果失败&#xff0c;则返回-1 参数 pathname: 创建的文件名 mode: 新建文件时&#xff0c;文件权限…

Android LAME原生音频

前言 我想大家都做过录音的功能吧&#xff0c;首先想到的是不是MediaRecorder&#xff1f;今天我们不用MediaRecorder&#xff0c;而是使用LAME库自己编译音频编码模块&#xff0c;很明显&#xff0c;这个需要用到NDK。凡是涉及到音视频编解码这块的&#xff0c;都需要用到And…

BUG: VS Code C++输出中文乱码

BUG: VS Code C输出中文乱码 环境 Windows 11 VS Code 编辑器详情 在Windows 使用 cout 函数输出中文时出现乱码 问题的原因在cmd的显示编码和c程序编码的不同。cmd默认的是gbk编码&#xff0c;而VS Code 软件的CMD终端默认是utf-8编码&#xff0c;因而在输出中文文本时会出…

QQ名片满级会员展示生成HTML源码

源码介绍 QQ名片满级会员展示生成HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;保存素材去选择QQ个性名片-选择大图模板-把图上传照片墙即可 源码效果 源码下载 蓝奏云&#xff1a;http…

唯众云课堂:领航智慧教育,赋能职教未来,打造高效人才培养新平台

随着《中国智慧教育发展报告 2023》的发布&#xff0c;智慧教育被正式定义为数字教育发展的高级阶段。然而&#xff0c;各职院在智慧教育的发展道路上&#xff0c;往往面临着诸多挑战&#xff0c;如缺乏一体化教学平台、优质教学资源不足等。唯众凭借深厚的产业洞察与教育实践经…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加载预训练模型参数对不齐和收到意外参数报错解决方案

使用mmdetection时遇到的问题比较多&#xff0c;首先要对自己要使用的预训练模型有一定的了解&#xff0c;并且懂得使用各种分类模型时不同的模型不同任务执行阶段需要参数上的对其。&#xff08;比如mask-rcnn和它的三个头之间的参数&#xff09;。 首先&#xff0c;谈谈torc…

基于SpringBoot设计模式之结构型设计模式·适配器模式

文章目录 介绍开始使用委托的适配器&#xff08;媒体播放器&#xff09;架构图定义被适配者定义需求接口定义适配者 使用继承的适配器&#xff08;手机充电接口&#xff09;架构图定义被适配者定义需求接口定义适配者 测试样例 总结优点缺点 介绍 在程序世界中&#xff0c;经常…

Python | Leetcode Python题解之第115题不同的子序列

题目&#xff1a; 题解&#xff1a; class Solution:def numDistinct(self, s: str, t: str) -> int:m, n len(s), len(t)if m < n:return 0dp [[0] * (n 1) for _ in range(m 1)]for i in range(m 1):dp[i][n] 1for i in range(m - 1, -1, -1):for j in range(n …

词法与语法分析器介绍

概述 词法和语法可以使用正则表达式和BNF范式表达&#xff0c;而最终描述文法含义的事状态转换图 Lex与YACC 词法分析器Lex 词法分析词Lex&#xff0c;是一种生成词法分析的工具&#xff0c;描述器是识别文本中词汇模式的程序&#xff0c;这些词汇模式是在特殊的句子结构中…

再见PS,Canva Create正式上线

再见&#xff0c;Photoshop&#xff01; Canva Create 正式上线&#xff0c;太疯狂了&#xff01;&#xff01; Canva是一款著名的免费在线AI图像生成器 构想你的创意&#xff0c;然后将其添加到你的设计中。使用最佳的AI图像生成器&#xff0c;观察你的文字和短语变换成美丽…

探索Java的DNA-JVM字节码深度解析

引言 在Java的世界里&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是我们程序运行的心脏。而字节码&#xff0c;作为JVM的血液&#xff0c;携带着程序的执行指令。今天&#xff0c;我们将深入探索Java字节码的奥秘&#xff0c;一窥JVM如何将人类可读的代码转化为机器可执…