深度学习InputStreamReader类

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——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.mfbz.cn/a/500921.html

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

相关文章

SpringMVC注解及使用规则

文章目录 前言一、SpringMVC注解是什么?二、使用步骤1.注解使用2创建JSP3 SpringMVC视图1. 逻辑视图(Logical View)2. 物理视图(Physical View)区别和关系 4 SpringMVC注解总结 总结 前言 提示:这里可以添…

Java运算符-三元运算符,这你必须得会!

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

08-研发流程设计(上):如何设计Go项目的开发流程?

在Go 项目开发中,我们不仅要完成产品功能的开发,还要确保整个过程是高效的,代码是高质量的。 所以,Go 项目开发一定要设计一个合理的研发流程,来提高开发效率、减少软件维护成本。研发流程会因为项目、团队和开发模式…

基于SSM的百货中心供应链管理系统设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套百货中心供应链管理系统有管理…

政安晨:【Keras机器学习实践要点】(九)—— 保存、序列化和导出模型

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 这篇文章是保存、序列化和导出模型的完整指南。 …

python实战之进阶篇(一)

定义类 1. 构造方法 2. 实例方法 3. 类方法 类似于Java中的静态方法, 使用方式: 类名.类方法 4. 私有变量 5. 私有方法 6. 使用属性set和get

vue3+threejs新手从零开发卡牌游戏(二十一):添加战斗与生命值关联逻辑

首先将双方玩家的HP存入store中,stores/common.ts代码如下: import { ref, computed } from vue import { defineStore } from piniaexport const useCommonStore defineStore(common, () > {const _font ref() // 字体const p1HP ref(4000) // 己…

4、Cocos Creator 动画系统

目录 1、Clip 参数 2、动画编辑器 3、基本操作 更改时间轴缩放比例 移动显示区域 更改当前选中的时间轴节点 播放 / 暂停动画 修改 clip 属性 快捷键 4、模拟实验 5、动画事件 6、注意事项 参考 Animation 组件是节点上的一个组件。Clip 动画剪辑就是一份动画的声…

【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】

edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站,但chrome浏览器可以登录浏览器插件无法使用,比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站,但chro…

InfoNCE loss

InfoNCE loss是一种用于自监督学习的损失函数,通常用于训练对比学习模型,如自编码器或神经网络。全称是"InfoNCE: Contrastive Estimation of Neural Entropy",基于对比学习的思想,旨在最大化正样本的相似性&#xff0c…

QSplashScreen

以前打红警的时候进入游戏界面会有一个启动界面,比如美国是有伞兵,英国有狙击手,韩国有黑鹰战机的一些介绍,这些就是启动界面,就是由QSplashScreen这个类来实现的。 QSplashScreen 是 Qt 框架中的一个类,用…

【每日跟读】常用英语500句(300~400)

【每日跟读】常用英语500句 I had to take a shower. 我洗了个澡 Go on in. 赶紧进去吧 Hold up. 等一下 They seem like nice people. 他们看起来像好人 Such a wonderful age. 如此美好的年纪 That’s very impressive. 真厉害 I can see that. 看得出来 You should …

绘制多个box箱型图

1.首先生成随机数据 import random # 创建一个153629行,13列的数据, random_data np.random.randn(153629, 13) #创建数据标签,后续将根据数据标签绘制不同的箱型图 label [0,1,2,3] labels np.asarray(random.choices(label,k 153629))…

U盘文件突然消失:原因分析与恢复策略

U盘遭遇“幽灵”之手,文件不翼而飞 你是否曾遭遇过这样的诡异情况:前一天还好好存放在U盘里的文件,第二天却突然消失得无影无踪?这简直就像是一场无声的灾难,令人措手不及。U盘作为我们日常工作和生活中不可或缺的数据…

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…

java数据结构与算法刷题-----LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 二分查找 二分查找 解题思路:时间复杂度O( l o g 2 …

读所罗门的密码笔记05_新的力量平衡

1. 技术发展 1.1. 美国和中国俨然成为人工智能研究、开发和部署方面无可争议的领导者 1.2. 人类从未彻底阻止某种技术的发展,虽然不同国家在不同时间对克隆、化学武器和核武器等技术采取了暂停或禁止措施,但我们仍在继续推进最前…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释,我们可以自己来从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar。大家可以自行去官…

第十四届蓝桥杯第十题:蜗牛分享

问题描述 输入格式 输出格式 输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。 样例输入 3 1 10 11 1 1 2 1样例输出 4.20样例说明 蜗牛路线:(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1…

vsqt更改ui,cpp报错(唯二)解决方法,及ui界面布局在cpp文件的运用基本流程

qt的ui布局界面如下 点cpp文件->编译 此时就会自动生成ui_xxx.h 这里是ui文件里面就有类名:Ui_文件名字 下面就有一个类继承于这个类 你所使用的这个ui指针,就这么来的 ***报错解决方法有两种:***第一种:如果改了ui&#x…