InputStreamReader类详解

news2025/2/1 17:03:19

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • `InputStreamReader`类
    • 概述
    • 源代码解析
    • 应用场景案例
      • 例1:读取网络资源
      • 例2:读取本地文件
    • 优缺点分析
    • 类代码方法介绍
      • 构造方法
      • 方法
    • 测试用例
      • 用例代码演示
      • 测试结果
      • 用例代码解析
    • 不关IO流会当如何?
    • 全文小结
    • 总结
  • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

前言

  在Java开发中,输入输出流是非常重要的一个部分。而InputStreamReader类则是常用于将字节流转换为字符流的类,可以帮助程序员处理输入输出流时的一些问题。

摘要

  InputStreamReader类是Java中的一个字符流类,它用来将字节流转换为字符流,以便更容易的进行处理。在输入流中,InputStreamReader类可以将一个字节输入流转换为字符输入流。在输出流中,InputStreamReader类可以将一个字符输出流转换为字节输出流。这个类的作用是在不同的输入输出流之间转换数据类型,解决了数据类型不匹配的问题。

InputStreamReader

概述

  InputStreamReader类是Java.io包下的一个类,它可以将字节流转换为字符流。InputStreamReader类提供了多个构造函数,可以通过指定不同的编码方式来将字节流转换为字符流。在使用InputStreamReader时,需要注意输入流的字符编码和输出流的字符编码应该保持一致,否则会出现乱码的情况。

源代码解析

InputStreamReader类的关键代码如下所示:

public class InputStreamReader extends Reader {
    private final StreamDecoder sd;
    ...
    public InputStreamReader(InputStream in) {
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
        } catch (UnsupportedEncodingException e) {
            throw new Error(e);
        }
    }
    ...
    public String getEncoding() {
        return sd.getEncoding();
    }
    ...
}

  从源代码可以看到,在InputStreamReader类的构造函数中,调用了StreamDecoder的forInputStreamReader()方法,将字节流转换为字符流。在这个过程中,我们可以通过getEncoding()方法来获取字符编码,以便更好的进行字节流和字符流之间的转换。

应用场景案例

下面将介绍InputStreamReader类在实际开发中的应用场景案例。

例1:读取网络资源

    //读取网络资源
    public static void testReadURL() throws IOException {
        URL url = new URL("http://www.baidu.com");
        URLConnection conn = url.openConnection();
        InputStream in = conn.getInputStream();
        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);

        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        br.close();
        isr.close();
        in.close();
    }

  这个示例演示了如何通过InputStreamReader类从网络中读取资源。在这个例子中,我们首先使用URL类打开一个连接,然后再从连接中获取字节输入流,接着将字节输入流转换为字符输入流,最后使用缓冲字符流来读取数据,并输出到控制台上。

案例演示结果如下:

在这里插入图片描述

例2:读取本地文件

    public static void testReadFile() throws IOException {
        FileInputStream fis = new FileInputStream("./template/fileTest.txt");
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);

        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        br.close();
        isr.close();
        fis.close();
    }

    public static void main(String[] args) throws IOException {
        testReadFile();
    }

  这个示例演示了如何使用InputStreamReader类从本地文件中读取资源。在这个例子中,我们首先使用FileInputStream类打开一个本地文件,然后再从文件中获取字节输入流,接着将字节输入流使用"UTF-8"编码方式转换为字符输入流,最后使用缓冲字符流来读取数据,并输出到控制台上。

案例演示结果如下:

在这里插入图片描述

优缺点分析

  InputStreamReader类的优点在于可以将字节流转换为字符流,方便程序员进行字符处理。同时,也提供了多种编码方式来进行转换,可以适应不同的字符编码需求。

  缺点在于需要注意输入流和输出流的字符编码应该保持一致,否则会出现乱码的情况。

类代码方法介绍

构造方法

  • InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader对象。
  • InputStreamReader(InputStream in, Charset charset):创建一个使用指定字符集的InputStreamReader对象。
  • InputStreamReader(InputStream in, CharsetDecoder dec):创建一个使用指定字符集解码器的InputStreamReader对象。
  • InputStreamReader(InputStream in, String charsetName):创建一个使用指定字符集名称的InputStreamReader对象。
  • InputStreamReader(InputStream in, CharsetDecoder dec, int minCharBufferSize):创建一个使用指定字符集解码器和最小字符缓冲区大小的InputStreamReader对象。

方法

  • int read() throws IOException:读取一个字符并返回。
  • int read(char cbuf[]) throws IOException:读取字符到缓冲区中,并返回字符个数。
  • int read(char cbuf[], int offset, int length) throws IOException:读取指定长度的字符到缓冲区中,并返回字符个数。
  • boolean ready() throws IOException:检查此流是否准备好读取。
  • boolean markSupported():判断此流是否支持mark和reset方法。
  • void mark(int readAheadLimit) throws IOException:标记此流的当前读取位置。
  • void reset() throws IOException:将此流的读取位置重置为标记位置。
  • long skip(long n) throws IOException:跳过n个字符的读取。
  • String getEncoding():获取此流使用的字符编码名称。
  • void close() throws IOException:关闭此流并释放与之关联的所有系统资源。

测试用例

下面给出了InputStreamReader类的一个测试用例。

用例代码演示

package com.example.javase.io.reader.inputStreamReader;

import java.io.*;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/19 10:37
 */
public class InputStreamReaderTest {
    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("./template/fileTest.txt");
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
        BufferedReader br = new BufferedReader(isr);

        String line = br.readLine();
        System.out.println("line:" + line);
        br.close();
        isr.close();
        fis.close();
    }
}

测试结果

根据如上测试用例本地测试结果如下,仅供参考:

在这里插入图片描述
  可以看到测试用例结合InputStreamReader类的使用,成功将fileTest.txt文件的内容读取并控制台输出。

用例代码解析

  如上测试代码给同学们演示了如何使用 InputStreamReader 类从文件中读取文本数据。具体来说,测试用例实现步骤非常简单,首先创建了一个 FileInputStream 对象来打开文件,然后将该对象传递给 InputStreamReader 构造函数,以及用于指定文本编码的字符串 “UTF-8”。最后,它使用 BufferedReader 对象读取一行文本,然后关闭所有打开的流,这点一定是需要注意的,经常会被忽视。(该程序假定文本文件是 UTF-8 编码。)

不关IO流会当如何?

  针对该问题,我来给大家普及一下,若只使用IO流而不关闭流,会有如何影响,同学们请看:

  1. 浪费资源:打开的文件句柄或网络连接等资源不会被释放,会一直占用系统资源,导致系统资源的浪费。

  2. 内存泄漏:如果没有关闭流,内存中就会留下未释放的缓存,可能会导致内存泄漏。

  3. 数据丢失:如果没有关闭流或刷新缓存,部分数据可能不会被写入到文件或网络中,导致数据丢失。

  4. 程序异常:长时间未关闭流可能会导致程序异常或崩溃,尤其是在多线程程序中,需要确保及时关闭流来避免程序异常。

  因此,在Java中,使用完IO流后应该及时关闭流以释放资源、避免内存泄漏和数据丢失等问题。可以使用try-finally块或try-with-resources语句块来确保及时关闭流。

全文小结

  在本文中,我们依次介绍了InputStreamReader类的定义、作用、源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例,希望可以帮助同学们更好的理解InputStreamReader类,以便于更快速的掌握它,吃透它。

总结

  InputStreamReader类是Java中的一个字符流类,用于将字节流转换为字符流。在Java的输入输出流处理中,是非常重要的一部分。在使用InputStreamReader类时,需要注意输入流和输出流的字符编码应该保持一致,否则会出现乱码的情况。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

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

相关文章

刷题之动态规划

前言 大家好,我是jiantaoyab,开始刷动态规划的题目了,要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 :dp数组中每一个下标对应值的含义是什么->dp[i]表示什么状态转移方程: dp[i] 等于什么1 和 2 是…

C++项目——集群聊天服务器项目(六)MySQL模块

Hello,大家好啊,最近比较忙,没来得及更新项目,实在抱歉~今天就恢复更新拉~ 在验证完网络模块与业务模块代码可以正常使用后,需完成的操作是与底层数据库进行交互,为实现各类用户查询、增删业务奠定良好的基…

C语言goto语句介绍

在C语言中,goto语句是一种流程控制语句,用于无条件地转移到程序中的特定标签位置。尽管goto语句在编程中具有一定的争议,但在某些情况下,它可以提供一种简单有效的解决方案。本文将深入介绍C语言中的goto语句,包括其基…

量化交易入门(二十九)布林带指标实现和回测

首先我们来看一张图,这张图就是拿的苹果股票2020年1月1日到2023年12月30日的历史数据进行回测后生成的。图中绿色箭头是买入点,红色箭头是卖出点。我们看到大部分的时候是在股价较低的时候买入,在股价较高的时候卖出,好像挺不错的…

K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(中)

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 在上一章节中,我们详细探讨了Pod的亲和性&…

计算机网络(第八版)-第1章课后习题参考答案

计算机网络(第八版)-第1章课后习题参考答案 本文是对自己之前文章的格式化:https://blog.csdn.net/qq_46396470/article/details/132788972?spm1001.2014.3001.5502 T1-01 计算机网络向用户可以提供哪些服务? 连通性和共享 ,例如音频&…

Lecture 1 - Introduction

Lecture 1 - Introduction MIT 6.824 Distributed Systems 1、概念预览 分布式系统需要考虑的因素: Parallelism :并行性Fault tolerence :容错性Physicial :不同系统之间物理距离引起的通信问题**Security ** :不…

WPF 路由事件 数据驱动 、Window 事件驱动

消息层层传递,遇到安装有事件侦听器的对象,通过事件处理器响应事件,并决定事件是否继续传递; 后置代码中使用AddHandler方法设置事件监听器,该方法的 第一个参数是指定监听的路由事件类型对象, 第二个参数…

3.29 day1 freeRTOS

1.总结keil5下载代码和编译代码需要注意的事项 注意要将魔术棒的的debug选项中的setting中的flashdownload中的reset and run 勾选上,同时将pack中的enable取消勾选 2.总结STM32Cubemx的使用方法和需要注意的事项 可以通过功能列表对引脚进行设置,并且可…

153 Linux C++ 通讯架构实战8 ,日志打印实战,设置时区,main函数中顺序调整

日志打印实战 //日志的重要性:供日后运行维护人员去查看、定位和解决问题; //新文件:ngx_printf.cxx以及ngx_log.cxx。 //ngx_printf.cxx:放和打印格式相关的函数; //ngx_log.cxx:放和日志相关…

[Python人工智能] 四十五.命名实体识别 (6)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型(注意力问题探讨)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。这篇文章将详细结合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别…

bugku-web-本地管理员

在页面源码的最右段发现一个base加密数据 dGVzdDEyMw 解密后 test123 将test作为账号123为密码尝试 说这个ip被禁止访问 那么问题应该出现在ip上 这里将请求报文抓取下来 POST / HTTP/1.1 Host: 114.67.175.224:18838 Content-Length: 18 Cache-Control: max-age0 Upgrade-Ins…

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议,它允许你读取经过过滤器处理的数据流…

MHA 高可用配置 及故障切换

目录 一 什么是 MHA 1, MHA 概念 2,MHA 架构 2,1 传统mysql 架构存在问题 2.2 MHA高可用 3,MHA 的组成 4,数据同步方式 4.1 同步复制 4.2 异步复制 ​编辑 4.3 半同步复制 5,MHA 的特点 6, MHA工作原理…

OpenAI发布Voice Engine模型!用AI合成你的声音!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

解决WSL更新速度慢的方案

在Windows上安装Docker Desktop时,如果选择使用WSL,则可能会出现在运行程序前要求升级WSL的步骤。程序会提示使用下面指令来升级 wsl.exe --update但是升级速度特别慢,于是在网络不稳定的情况下经常会出现下载失败的情况。 百度里一直没搜到…

shell的工作原理

本文旨在讲解shell的工作原理,希望读完本文,能使读者对shell的工作原理有一定的认识,废话不多说,开唠! 在讲解shell的工作原理之前,我要首先给大家讲一下什么是操作系统,以Linux操作系统为例&am…

【Springboot整合系列】SpringBoot整合WebService

目录 Web服务介绍Web服务的两种类型Web服务架构Web服务的主要特点Web服务使用场景Web服务标准和技术 WebService介绍WebService的作用适用场景不适用场景 WebService的原理三个角色相关概念 WebService开发框架代码实现服务端1.引入依赖2.实体类3.业务层接口接口实现类 4.配置类…

vue中使用图片url直接下载图片

vue中使用图片url直接下载图片 // 下载图片downloadByBlob(url, name) {let image new Image()image.setAttribute(crossOrigin, anonymous)image.src urlimage.onload () > {let canvas document.createElement(canvas)canvas.width image.widthcanvas.height image…

YoloV8实战:使用YoloV8检测钢材表面缺陷

摘要 本文讲解一下实战,使用YoloV8检测钢材表面缺陷。起因是有粉丝搞不定这个数据集,检测的时候出现了不收敛的情况。所以,给大家讲讲如何去做。 不收敛的原因 一般遇到不收敛的情况,就是数据转化的时候出错了,大家可以打开runs下面的训练日志,观察一下是否正常。 如…