深度学习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流而不关闭流,会有如何影响,同学们请看:
-
浪费资源:打开的文件句柄或网络连接等资源不会被释放,会一直占用系统资源,导致系统资源的浪费。
-
内存泄漏:如果没有关闭流,内存中就会留下未释放的缓存,可能会导致内存泄漏。
-
数据丢失:如果没有关闭流或刷新缓存,部分数据可能不会被写入到文件或网络中,导致数据丢失。
-
程序异常:长时间未关闭流可能会导致程序异常或崩溃,尤其是在多线程程序中,需要确保及时关闭流来避免程序异常。
因此,在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电子书籍、简历模板等海量资料。
相关文章:

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

2023年后端面试总结
备注:这篇文章是我在2023年年初在自己的网站上写的,最近在迁移技术文章,我感觉这个也是和咱程序员相关,所以今天就决定把它迁移过来。 .......................................................................分割线..........…...
axios实现前后端通信报错Unsupported Media
使用axios向SpringBoot的后端使用post请求发送数据,发现报错Unsupported Media,最终解决方案如下: 检查变量名字是否一样,即前端传给后端的json数据键名要与后端接收的对象的成员变量名字一致检查Content-Type,post请…...
网络套接字补充——TCP网络编程
六、TCP网络编程 6.1IP地址字符串和整数之间的转换接口 //字符串转整数接口 #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *inp); int inet_pton(int af, const char *strptr, …...

Nginx-记
Nginx是一个高性能的web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。 (1)更快 这表现在两个方面:一方面,在正常情况下&…...
JS面试题:call,apply,bind区别
1. 共同点 三者共同点都是改变函数内部this指向的方法 2. call用法 ini 复制代码 var a 2; var b 2; function func() { console.log(this.a, this.b) } let obj { a: 1, b: 1 } func.call(obj) func.call() 输出结果: 复制代码 1 1 2 2 解析࿱…...

Charles抓包配置代理手机连接
Charles下载地址: Charles_100519.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Charles_100519.zip最新版正式版官方版绿色版下载,Charles_100519.zip安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com…...
NA555、NE555、SA555和SE555系列精密定时器
这份文件是关于德州仪器(Texas Instruments)生产的NA555、NE555、SA555和SE555系列精密定时器(Precision Timers)的数据手册。以下是该文件的核心内容概述: 产品特性: 德州仪器的NA555、NE555、SA555和SE55…...

黑马鸿蒙笔记2
1.图片设置: 1 加载网络图片,申请权限。 申请权限:entry - src - resources - module.json5 2 加载本地图片 ,两种加载方式 API 鼠标悬停在Image, 点击show in API Reference interpolation:看起来更加清晰 resou…...
微信小程序uniapp+vue3+ts+pinia的环境搭建
一.创建uniapp项目 通过vue-cli创建 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project二.安装依赖: 1.pnpm i 2.运行项目: 将package.json的 "dev:mp-weixin": "uni -p mp-weixin",改为 "serve": "u…...
MongoDB聚合运算符:$let
文章目录 MongoDB聚合运算符:$let语法使用举例 MongoDB聚合运算符:$let $let聚合运算符绑定用于表示计算的变量,并返回表达式的结果。 语法 {$let:{vars: { <var1>: <expression>, ... },in: <expression>} }vars 用于在…...

HarmonyOS像素转换-如何使用像素单位设置组件的尺寸。
1 卡片介绍 基于像素单位,展示了像素单位的基本知识与像素转换API的使用。 2 标题 像素转换(ArkTS) 3 介绍 本篇Codelab介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例,向开发者讲解了如何使用像素单位设…...

【前端面试3+1】05v-if和v-show的区别、v-if和v-for能同时使用吗、Vuex是什么?【合并两个有序链表】
一、v-if和v-show的区别 v-if 和 v-show 是 Vue.js 中用来控制元素显示与隐藏的指令。 1.v-if: v-if 是根据表达式的真假值来决定是否渲染元素。当表达式为真时,元素会被渲染到 DOM 中;当表达式为假时,元素不会被渲染到 DOM 中。每…...
Unity WebRequest 变得简单
作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注…...

vue 窗口内容滚动到底部
onMounted(() > {scrollToBottom() }) // 滚动到底部方法 const scrollToBottom () > {// 获取聊天窗口容器let chatRoom: any document.querySelector(".chat-content");// 滚动到容器底部chatRoom.scrollTop chatRoom.scrollHeight; } 效果 聊天窗口代码…...

代码随想录算法训练营Day38|LC509 斐波那契数列LC70 爬楼梯LC746 使用最小花费爬楼梯
一句话总结:难的还在后头呢。 原题链接:509 斐波那契数列 甚至用不上数组,用两个变量滚动交替即可完成。 class Solution {public int fib(int n) {if (n < 2) return n;int pre 0, cur 1;int ans 0;for (int i 2; i < n; i) {an…...
Qt5.14.2 大神的拖放艺术,优雅而强大的交互体验
作为图形界面软件,良好的用户交互体验是制胜的关键。而在Qt大神们的绝世编程之道中,拖放操作无疑占据着非常重要的一席之地。它不仅操作简单直观,而且可以完成大量看似复杂的任务,是提升用户体验质量的利器。今天,就让…...

python3将exe 转支持库错误 AssertionError: None does not smell like code
exe -> pyc包(*.exe_extracted) 安装反编译工具 exe反编译工具:pyinstxtractor.py下载:https://sourceforge.net/projects/pyinstallerextractor/ python pyinstxtractor.py hello.exe包反编译 懒的写!!! 这有详…...
[EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
硬件型号驱动情况主板 Dell Inspiron 15R 5567 处理器Intel Core i7-7500U 2.50 GHz Processor (4M Cache, up to 3.50 GHz)已驱动内存8GB, 2400MHz, DDR4, up to 16GB已驱动硬盘东芝 NVMe 512G已驱动显卡Intel HD Graphics 620已驱动声卡ALC3246 Analog (ALC256)已驱动网卡无无…...
大学 Python 程序设计实验报告:判断密码是否符合要求
目录: 利用 string 模块判断使用正则表达式判断 密码强度判断,输入一个密码,判断密码是否符合要求。 要求密码长度8-12位,密码中必须包含大写字母、小写字母和数字,不能含有其他符号。 如果符合要求输出"密码符合…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...