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 !!!


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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 统一数据返回格式

在 Spring Boot 项目中,统一的数据格式返回是一种良好的实践,它提高了代码的可维护性和一致性,并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。 1 为什么需要统一数据返回格式 ⽅便前端程序员更…

2024年电工杯高校数学建模竞赛(A题) 建模解析| 园区微电网风光储协调优化配置

问题重述及方法概述 问题1:各园区独立运营储能配置方案及其经济性分析 经济性分析采用成本-效益分析方法,计算购电量、弃风弃光电量、总供电成本和单位电量平均供电成本等指标。 问题2:联合园区储能配置方案及其经济性分析 经济性分析采用成…

【链表】Leetcode 92. 反转链表 II【中等】

反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#x…

将 KNX 接入 Home Assistant 之一 准备硬件

不久前有人小伙伴买了usb转knx ,详情请看 一个 usb 转 knx 的模块 然后想通过这个设备接入 Home Assistant。 后来了解了一下 Home Assistant 并不直接支持 usb转KNX的接入&#xff0c;需要通过KNXD插件转接才行。 然而尝试了很多次叶没有成功&#xff0c;使用西门子的usb接口以…

【香橙派AIpro】开箱测评

1.板子开箱 哟&#xff0c;看起来还不错哦&#xff01;&#xff01;&#xff01; 收货清单&#xff1a; 主板*1 1.5m数据线*1 充电头*1 1.1.充电头 近65W的充电头&#xff0c;不错不错。 1.2.主板 1.2.1.上面 哇噢&#xff0c;还送了2.4/5G的WiFi和蓝牙天线。 emm&#xf…

React-入门

React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库 既可以写基于浏览器的应用&#xff0c;还可以写苹果和安卓的原生应用 优势 开发环境搭建 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层是由Webpack构建&#xff0c;封装了配置细…

redis数据类型之string,list

华子目录 key操作说明SCAN cursor [MATCH pattern] [COUNT count]dump与restorekeys 通配符 示例演示 string说明setbit key offset valuegetbit key offsetsetrange key offset value List结构图相关命令lrem key count valueltrim key count value示例&#xff1a;使用 LTRIM…

图形学概述

图形学应用 游戏 游戏的画面好坏如何鉴定呢&#xff1f; 看游戏画面是否够亮&#xff1a;渲染中全局光照的好坏 《只狼》 为什么卡通游戏画面看起来是卡通的呢&#xff1f; 《无主之地3》 这些都是图形学需要着手解决的问题 电影 电影《黑客帝国》的特效也是通过计算机…

Python 全栈体系【四阶】(五十四)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 3. 文字识别技术 3.1 CRNNCTC(2015) CRNN&#xff08;Convolutional Recurrent Neural Network&#xff09;即卷积递归神经网络&#xff0c;是DCNN和RNN的组合&#xff0c;专门用于识别图像中的序列式对象。…

《python编程从入门到实践》day40

# 昨日知识点回顾 编辑条目及创建用户账户 暂没能解决bug&#xff1a; The view learning_logs.views.edit_entry didnt return an HttpResponse object. It returned None instead.# 今日知识点学习 19.2.5 注销 提供让用户注销的途径 1.在base.html中添加注销链接 …

[笔试强训day09]

文章目录 BC146 添加逗号DP2 跳台阶JZ61 扑克牌顺子解法一&#xff1a;排序模拟解法二&#xff1a;规律哈希 BC146 添加逗号 BC146 添加逗号 #include<iostream> #include<string>using namespace std;int main() {string s;cin>>s;string ans;for(int i0;i…

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干&#xff0c;说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则&#xff1f;

揭秘爬虫技术:从请求到存储的全方位解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、爬虫初探&#xff1a;请求与响应 二、数据解析&#xff1a;从混乱中提炼价值 三、数据…

微软发布多模态模型Phi-3-vision,仅4.2B,小模型大潜力

前言 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;模型参数规模与性能之间一直存在着密切的联系。近年来&#xff0c;虽然参数规模不断攀升&#xff0c;但随之而来的训练成本和推理成本也成为了制约模型发展的瓶颈。为了打破这一困境&#xff0c;微软推出了 Ph…

Livox-SDK2 用vs2017编译

Livox-SDK2 Livox-SDK2代码去上面下载&#xff0c;文章中给出的是用vs2019进行编译的&#xff0c;生成项目时用的 > cmake .. -G "Visual Studio 16 2019" -A x64 但如果我想用vs2017进行编译&#xff0c;那么只需要将上面语句改为如下&#xff1a; cmake .. -…

【数据结构】快速排序C语言

目录 前言 一、快排思想过程 二、算法思路 三、代码实现 C语言实现&#xff1a; C实现: 总结 前言 排序是一个相对复杂的过程,进一步思考排序这个问题,我们可以借助分治的思想来解决这个问题, 什么叫分治呢?就是把大问题化成小问题,进而缩小问题的规模,并且大问题和小问…

牛客NC166 连续子数组的最大和(二)【中等 前缀和数组+动态规划 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21 思路 前缀和数组动态规划Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

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

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

MyBatis报错:TypeException Could not set parameters for mapping问题解决

MyBatis报错&#xff1a;TypeException: Could not set parameters for mapping问题解决 问题收录 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{proper…

【详细介绍下PostgreSQL】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…