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.mzph.cn/news/780843.shtml

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

相关文章

Radash一款JavaScript最新的实用工具库,Lodash的平替!

文章目录 Lodash 的痛点进入正题--Radash特点 举例几个常用的api 一说lodash应该大部分前端同学都知道吧,陪伴我们好多年的JavaScript工具库,但是自从 ES6 出现后就慢慢退出前端人的视线,能ES6写的代码绝对不会用Lodash,也不是完全…

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值应用

基于STC12C5A60S2系列1T 8051单片机的一个按键长按开关机后一个按键单击长按都增加数值另一个按键单击长按都减少数值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介…

深入理解Java接口:定义、使用与重要性(day13)

导语:Java接口是Java编程语言中的一个核心概念,它提供了一种定义方法但不包含方法实现的方式。接口在Java编程中扮演着重要角色,能够帮助我们实现代码的高内聚、低耦合,提高代码的复用性和可维护性。本文将详细介绍Java接口的定义…

SQL复习专题

请结合B站-技术蛋老师 视频学习 核心语法 一、增:数据库/表格 create create database 数据库名;#创建表(列名类型) mysql> create table eggs_record(-> id int,-> egg_name varchar(10),-> sold date-> ); 这…

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建

Android熄屏/亮屏,旋转屏幕/横竖屏切换生命周期变化与activity销毁重建 1、熄屏/亮屏 熄屏后,Android生命周期走: onPause onStop 接着点亮Android手机屏幕,生命周期走: onRestart onStart onResume 2、旋转屏幕&…

服务器中有g++,但是查询不到,Command ‘g++‘ not found

有gcc但是查询不到g,gcc版本为9.5.0 (base) zyICML:~$ g -V Command g not found, but can be installed with: apt install g Please ask your administrator. 突然就出现这个问题,导致detectron装不上,现在有时间了专门研究下怎么解决 这…

阿里云8核32G服务器g8y租用优惠价格243.30元/月

阿里云8核32G服务器g8y租用优惠价格243.30元/月,配置云服务器g8y(ecs.g8y.2xlarge)8核32G、按固定带宽1M-5M、可选ESSD云盘40G起,优惠价格243.30元一个月, 阿里云服务器优惠活动 aliyunfuwuqi.com/go/aliyun 阿里云服务…

【重制版】在Android手机上安装kali Linux

前言 由于kali官方的Nethunter2的安装代码因为…无法访问,手头又没有一些受支持的机器3,所以做了这个脚本,供大家使用。 工具 搭载基于Android的手机TermuxVNC Viewer 安装必备软件(如已安装请忽略) 请到 https://www.hestudio.net/post…

公安可视化分析指挥调度平台的构成要素

匠心接单中...8年前端开发和UI设计接单经验,完工项目1000,持续为友友们分享有价值、有见地的干货观点,有业务需求的老铁,欢迎关注发私信。 公安可视化分析指挥调度平台是一个集成了多种技术和功能的综合性平台,主要由…

mysql 日期时间函数

学习了字符串函数,接着学习日期时间函数, 3,日期和时间函数 日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用DATE类型的参数外,也可以使用DATETIME或者TIMESTAMP类型的参数,但会忽略这些值…

Discuz采集发布插件

Discuz(简称DZ)是一款知名的开源论坛系统,广泛应用于各类网站社区。对于许多站长来说,保持论坛内容的更新是一项挑战,特别是在内容量庞大的情况下。为了解决这个问题,有一类特殊的插件是用于在Discuz论坛中…

康耐视visionpro-CogDistancePointLineTool工具详细说明

CogDistancePointLineTool功能说明: 测量点到线的距离 备注:在“Geometry-Measurement”选项中的所有工具都是测量尺寸或角度工具,包括测量线与线 的角度、点与线的距离、圆与圆的距离等测量工具,工具使用的方法相似。 ①.打开工具栏&#…

Elment ui 动态表格与表单校验 列表数据 组件

组件做个记录&#xff0c;方便以后会用到。 效果&#xff1a; 代码 &#xff1a; <template><el-dialog title"商品详情" :visible.sync"dialogVisible" width"80%"><el-tabs v-model"activeTab"><el-tab-pane…

正弦实时数据库(SinRTDB)的使用(8)-过滤查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

通过node 后端实现颜色窃贼 (取出某个图片的主体rgb颜色 )

1.需求 我前端轮播图的背景色 想通过每一张轮播图片的颜色作为背景色 这样的话 需要通过一张图片 取出图片的颜色 这个工作通过前端去处理 也可以通过后端去处理 前端我试了试 color-thief 的插件 但是 这个插件是基于canvas 的模式来的 我需要在小程序中使用这个插件 而且是…

E4440A安捷伦E4440A频谱分析仪

181/2461/8938产品概述&#xff1a; Agilent PSA 系列 E4440A 高性能频谱分析仪提供强大的一键式测量、多功能功能集和领先的技术&#xff0c;可满足您的项目和需求。 Agilent E4440A 频谱分析仪的其他功能和规格包括&#xff1a; 频率范围&#xff1a;3 Hz - 26.5 GHz/-0.19…

汇总:五个开源的Three.js项目

Three.js 是一个基于 WebGL 的 JavaScript 库&#xff0c;它提供了一套易于使用的 API 用来在浏览器中创建和显示 3D 图形。通过抽象和简化 WebGL 的复杂性&#xff0c;Three.js 使开发者无需深入了解 WebGL 的详细技术就能够轻松构建和渲染3D场景、模型、动画、粒子系统等。 T…

Java数据结构-双向不带头非循环链表(模拟实现LinkedList)

目录 1. 双向不带头非循环链表的介绍2. 相关功能的实现2.1 基本框架2.2 size2.3 addFirst2.4 addLast2.5 addIndex2.6 contains2.7 remove2.8 removeAllKey2.9 clear 3. 全部代码 前面我们学习了最简单的链表&#xff1a;单链表&#xff0c;今天我们学习双向不带头非循环链表&a…

分布式图床项目

一、图床架构分析 二、后台数据处理框架 秒传: 如果上传的文件已经在服务器中存在了,就不需要二次上传了,但是服务器会对这个文件的引用计数加一,这样服务器就知道这个文件是多个人持有的。先对上传的文件进行 md5 校验来判断服务器中已经存在相同的文件了(同样的文件拿到…

OpenHarmony无人机MAVSDK开源库适配方案分享

MAVSDK 是 PX4 开源团队贡献的基于 MavLink 通信协议的用于无人机应用开发的 SDK&#xff0c;支持多种语言如 C/C、python、Java 等。通常用于无人机间、地面站与通信设备的消息传输。 MAVLink 是一种非常轻量级的消息传递协议&#xff0c;用于与无人机&#xff08;以及机载无…