深入探讨Java中的OutputStreamWriter类

在这里插入图片描述

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


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

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

文章目录

  • 前言
  • 摘要
  • OutputStreamWriter类
    • 概述
    • 源代码解析
    • 应用场景案例
    • 优缺点分析
    • 类代码方法介绍
    • 测试用例
      • 代码演示
      • 测试结果
      • 代码解析
    • 全文小结
    • 附录源码
  • 总结
  • ☀️建议/推荐你
  • 📣关于我

前言

  Java是一门跨平台的编程语言,它的核心优势在于其可移植性和跨平台性。Java的IO类库提供了一系列的类和方法,用于处理文件和网络IO操作。在这些类和方法中,OutputStreamWriter类可以用于将字符流转换为字节流,使得文本可以被写入到文件或网络流中。

摘要

  本文将对Java中的OutputStreamWriter类进行详细介绍。我们将分析该类的源代码,并探讨其应用场景和优缺点。此外,我们还将介绍该类的方法和测试用例,以帮助读者更好地理解OutputStreamWriter类的使用方法和效果。

OutputStreamWriter类

概述

  OutputStreamWriter类是Java中一个非常基础的类,其用途是将字符流转换为字节流。这个类通常用于将字符数据写入到文件或网络流中。它可以接受不同的字节编码格式,如UTF-8, GBK等等,并将字符数据转换为相应的编码格式,从而写入到文件或网络中。

  OutputStreamWriter类是一个抽象类,它实现了Writer接口,具有write(), flush()等方法。此外,该类还具有一些特殊的构造函数,用于接受不同的字符编码格式和字节输出流。

下面是OutputStreamWriter类的构造函数:

public OutputStreamWriter(OutputStream out);
public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException;
public OutputStreamWriter(OutputStream out, Charset charset);

  在这些构造函数中,第一个构造函数用于建立与底层字节输出流out的连接。第二个构造函数除了连接字节输出流外,还用于指定字符编码格式。第三个构造函数则使用Java的Charset类来指定编码格式。

源代码解析

  现在让我们来看看OutputStreamWriter类的源码,若想彻底搞懂,解读源码是必不可少的一步。

public class OutputStreamWriter extends Writer {private final StreamEncoder se;public OutputStreamWriter(OutputStream out) {super(out);try {se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);} catch (UnsupportedEncodingException e) {throw new Error(e);}}public OutputStreamWriter(OutputStream out, String charsetName)throws UnsupportedEncodingException {super(out);if (charsetName == null)throw new NullPointerException("charsetName");se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);}public OutputStreamWriter(OutputStream out, Charset cs) {super(out);if (cs == null)throw new NullPointerException("charset");se = StreamEncoder.forOutputStreamWriter(out, this, cs);}public String getEncoding() {return se.getEncoding();}public void write(int c) throws IOException {se.write(c);}public void write(char cbuf[], int off, int len) throws IOException {se.write(cbuf, off, len);}public void flush() throws IOException {se.flush();}public void close() throws IOException {se.close();}
}

  OutputStreamWriter类是继承自Writer类的,它实现了write(), flush()等方法。同时,该类还有一个StreamEncoder类的成员变量。
  StreamEncoder类是OutputStreamWriter类内部使用的一个编码器,它实现了字符流向字节流的转换,从而使得字符数据能够被写入到文件或网络流中。在OutputStreamWriter类中,所有的写操作都是通过StreamEncoder来完成的。

部分源码如下:

在这里插入图片描述

  下面是OutputStreamWriter类的继承关系图:

            +-------------+|   Writer    |+-------------+^|+-------------+|   OutputStreamWriter   |+-------------+^|+-------------+|   OutputStream        |+-------------+

  在这个继承关系中,OutputStreamWriter类继承了Writer类,Writer类是Java中所有字符输出流的抽象基类,而OutputStreamWriter类是将字符流转换为字节流的桥梁。它将字符从Writer对象转换为字节,并将字节写入底层的OutputStream。因此,OutputStreamWriter类还间接继承了OutputStream类,它是Java中所有字节输出流的抽象基类。

应用场景案例

  OutputStreamWriter类通常用于将数据以文本的形式写入到文件或网络流中。

  以下是一个简单的示例代码,用于将一段文本写入到文件中。

public class OutputStreamWriterTest {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("./template/fileTest.txt");OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");osw.write("Hello world!!!");osw.close();} catch (IOException e) {e.printStackTrace();}}
}

  在这个例子中,我们建立了一个文件输出流fos,并将其传递给OutputStreamWriter构造函数。我们还指定了字符编码格式为UTF-8。然后,我们使用OutputStreamWriterwrite()方法将"Hello world!!!"文本写入到文件中。最后,我们关闭OutputStreamWriter流。

测试结果如下:

在这里插入图片描述

优缺点分析

OutputStreamWriter类的主要优点是:

  1. 可以将字符数据以多种不同的编码格式写入到文件或网络流中。
  2. 可以接收不同类型的字节输出流作为参数,从而提供了很高的灵活性和可扩展性。
  3. 实现了Writer接口,具有write(), flush()等方法,操作简便。

OutputStreamWriter类的主要缺点是:

  1. 可能会存在性能问题,由于该类内部使用了StreamEncoder类来完成字符流到字节流的转换,所以在一些特定的场景下,该类可能会存在性能瓶颈。

类代码方法介绍

OutputStreamWriter类的主要方法包括:

方法用途
public OutputStreamWriter(OutputStream out)构造函数,建立与底层字节输出流out的连接。
public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException构造函数,建立与底层字节输出流out的连接,并指定字符编码格式charsetName。
public OutputStreamWriter(OutputStream out, Charset charset)构造函数,建立与底层字节输出流out的连接,并使用Java的Charset类来指定编码格式。
public String getEncoding()返回当前OutputStreamWriter的字符编码格式。
public void write(int c) throws IOException向输出流中写入一个字符。
public void write(char cbuf[], int off, int len) throws IOException向输出流中写入一个字符数组。
public void flush() throws IOException刷新输出流,将所有缓存的数据写入到底层字节输出流中。
public void close() throws IOException关闭输出流,释放所有相关的资源。

测试用例

  为了帮助读者更好地理解OutputStreamWriter类的使用方法和效果,我们提供了以下测试用例。

代码演示

package com.example.javase.io.writer.outputStreamWriter;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;/*** @author bug菌* @version 1.0* @date 2023/10/19 10:40*/
public class OutputStreamWriterDemo {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("./template/fileTest.txt");OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");osw.write("Hello world!my jym!!");osw.close();} catch (IOException e) {e.printStackTrace();}}
}

  如上测试用例可用于将"Hello world!my jym!!"文本写入到fileTest.txt文件中,测试结果可自行测试一下,也可以参考我如下的。

测试结果

  如下是通过如上测试用例所进行的演示结果截图,仅供参考:

在这里插入图片描述

代码解析

  针对如上测试用例,我这里做个代码分析,以帮助大家更快的理解并运用它,该测试用例主要是演示如何使用 OutputStreamWriter 类将字符流输出到文件中。

  首先创建了一个FileOutputStream对象,用于指定输出的文件路径。然后创建了一个OutputStreamWriter对象,将FileOutputStream对象传递给它。同时,还需要指定字符集(UTF-8),因为OutputStreamWriter对象会将字符写入到底层的FileOutputStream对象中,底层是以字节的形式保存数据的。接着,使用OutputStreamWriter对象的write方法将字符写入到输出流中,最后关闭流。如果在写入过程中出现异常,会将异常输出到控制台。

全文小结

  本文对Java中的OutputStreamWriter类进行了详细介绍。我们分析了该类的源代码,并探讨了它的应用场景和优缺点。我们还介绍了OutputStreamWriter类的方法和测试用例,希望这些内容能够帮助读者更好地使用这个类。

附录源码

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

总结

  OutputStreamWriter类是Java中一个非常基础的类,其用途是将字符流转换为字节流。该类通常用于将字符数据写入到文件或网络流中。它可以接受不同的字节编码格式,并将字符数据转换为相应的编码格式,从而写入到文件或网络中。

  OutputStreamWriter类的主要优点是提供了很高的灵活性和可扩展性,缺点是可能存在性能问题。

☀️建议/推荐你

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

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

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

📣关于我

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


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

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

相关文章

人工智能、机器学习和生成式人工智能之间有什么区别?

文 | BFT机器人 在这个数字的智能时代,大家对人工智能、机器学习和生成式人工智能这些名词字眼很熟悉,有些人或许对它们还有一些了解,但是当他们一起出现的时候,大家能够区别它们是什么意思吗?今天小编将带你们详细解…

【GPU驱动开发】- AST简介

前言 不必害怕未知,无需恐惧犯错,做一个Creator! AST,抽象语法树,是一种包含丰富语义信息的格式,其中包括类型、表达式树和符号等。 TranslationUnitDecl:该类表示一个输入源文件 ASTContext&…

一般情况下,硬件中使用Repeating Sequence出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的

一般情况下,出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的 把timer values 修改为0 1就好了,如果是0,0.1就不行,不会有下面的波形

spring boot 集成科大讯飞星火认知大模型

首先到官网https://console.xfyun.cn/services/aidoc申请key 一、安装依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

基于java SSM springboot+redis网上水果超市商城设计和实现以及文档

基于java SSM springbootredis网上水果超市商城设计和实现以及文档 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 …

Linux——进程控制(一)进程的创建与退出

目录 一、进程创建 1.写时拷贝 2.创建多个进程 二、进程终止 1.main函数的返回值 2.bash中的$? 3.自定义退出码 4.C语言的错误码 5.错误码与退出码的区别 6.代码异常终止 7.exit函数 8.总结 一、进程创建 在之前&#xff0c;我们学过linux中的非常重要的函数——…

苍穹外卖知识点总结(一)

简介 技术选型 展示项目中使用到的技术框架和中间件。 用户层&#xff1a;node.js Vue.js ElementUI 微信小程序 apache echarts 网关层&#xff1a;nginx 应用层&#xff1a;Spring Boot Spring MVC Spring Task httpclie…

Java毕业设计 基于SSM SpringBoot vue购物比价网站

Java毕业设计 基于SSM SpringBoot vue购物比价网站 SSM vue 购物比价网站 功能介绍 首页 图片轮播 商品 商品分类 商品详情 评论 收藏 商品攻略 商品信息 公告栏 在线反馈 登录 注册 个人中心 我的收藏 后台管理 登录 注册商品户 个人中心 修改密码 个人信息 商品户管理 用户…

Excel2LaTeX插件的使用、LaTeX表格

目录 一、下载Excel2Latex 二、使用Excel2Latex 1、将Excel2LaTeX文件添加到加载项 2、导出LaTex的表格数据 3、注意事项 1&#xff09;生成的latex表格断断续续问题 2&#xff09;改变线形的粗细 3&#xff09;表格太大&#xff0c;需要缩小到适应大小 4&#xff09;…

ETL是什么

一、ETL概念 ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xff…

qsort函数(任意类型排序)

void qsort(void base, size_t num, size_t size, int (*compar)(const void*p1, const void*p2))排序函数&#xff0c;可以排序各种类型的函数 四个参数&#xff1a; void qsort( void base&#xff0c;&#xff1a;base指向数组的第一个元素 size_t num,&#xff1a;base…

Gitlab: 私有化部署

目录 1. 说明 2. 资源要求 3. 安装 4. 配置实践 4.1 服务器 4.2 人员与项目 4.2 部署准备 4.2.1 访问变量及用户账号设置 4.2.2 Runner设置 4.2.3 要点 5. 应用项目 CI/CD 6. 参考 1. 说明 gitlab是一个强大且免费的代码管理/部署工具&#xff0c;能统一集成代码仓…

ubuntu基础操作(1)-个人笔记

搜狗输入法Linux官网-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://pinyin.sogou.com/linux 1.关闭sudo密码&#xff1a; 终端&#xff08;ctrl alt t&#xff09;输入 sudo visudo 打开visudo 找到 %sudo ALL(ALL:ALL) ALL 这一行…

视频和音频使用ffmpeg进行合并和分离(MP4)

1.下载ffmpeg 官网地址&#xff1a;https://ffmpeg.org/download.html 2.配置环境变量 此电脑右键点击 属性 - 高级系统配置 -高级 -环境变量 - 系统变量 path 新增 文件的bin路径 3.验证配置成功 ffmpeg -version 返回版本信息说明配置成功4.执行合并 ffmpeg -i 武家坡20…

DTD、XML阐述、XML的两种文档类型约束和DTD的使用

目录 ​编辑 一、DTD 什么是DTD&#xff1f; 为什么要使用 DTD&#xff1f; 内部 DTD 声明 具有内部 DTD 的 XML 文档 外部 DTD 声明 引用外部 DTD 的 XML 文档 二、XML 什么是XML&#xff1f; XML 不执行任何操作 XML 和 HTML 之间的区别 XML 不使用预定义的标记…

LeetCode 热题100 刷题笔记

一&#xff1a;哈希表 一般哈希表都是用来快速判断一个元素是否出现集合里。 直白来讲其实数组就是一张哈希表&#xff0c;哈希表中关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素。 1.两数之和 题目链接&#xff1a;. - 力扣&#xff08;LeetCode…

MATLAB练习题:判断整数是否为回文数

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 给定一个1到1亿之间的整数&#xff0c;请判断这个整数是否为回…

【毛毛讲书】【时间贫困】时间都去哪了?

重磅推荐专栏&#xff1a; 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域&#xff0c;包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用&#xff0c;以及与之相关的人工智能生成内容&#xff…

奇点云:SAFe框架下,我们对平台软件工程生产线做了4项改造

导读&#xff1a; 客户规模扩大&#xff0c;如何保证大数据软件产品和服务质量始终如一&#xff1f;几乎所有成长中的软件厂商&#xff0c;尤其是需要通过私有化部署交付的厂商&#xff0c;都会面临这个问题。正如《人月神话》中多次表明的&#xff0c;单纯地增加人手、扩大团队…

网络传输基本流程(封装,解包)+图解(同层直接通信的证明),报头分离问题,协议定位问题,协议多路复用

目录 网络传输基本流程 引入 封装 过程梳理 图解 报文 解包 过程梳理 图解 -- 同层直接通信的证明 总结 解包时的报头分离问题 举例 -- 倒水 介绍 自底向上传输时的协议定位问题 介绍 解决方法 协议多路复用 介绍 优势 网络传输基本流程 引入 首先,我们明确…