深入探讨Java中的OutputStreamWriter类

news2024/11/16 6:05:33

在这里插入图片描述

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

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

相关文章

动态规划(算法竞赛、蓝桥杯)--分组背包DP

1、B站视频链接&#xff1a;E16 背包DP 分组背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i组第j个物品的体积 s[i]:第i组物品的个数 int f[N][N]; // f[i,j]:前i组物品&#xff0c;能放…

Power Apps 学习笔记 -- Plugin

文章目录 1. Plugin 简介2. Plugin 配置2.1 步骤Step核心分析 3. Plugin 代码 1. Plugin 简介 Plugin基础教程 : Plugin基础教程 插件Plugin: 1. 插件Plugin通常用于默认数据处理操作区间&#xff0c;增加数据默认行为的方法。(无重用性)2. Plugin 配置 .NET环境&#xff1a;.…

图像分割 - 轮廓拟合(最小外接矩形和圆形)

1、前言 拟合:用一条光滑的曲线将平面上的点连接起来 轮廓拟合:将凹凸不平的轮廓用平整的几何图形体现出来 本章将介绍如何用最小外接矩形或者最小外接圆形将下面的图像轮廓拟合 几何图形的轮廓绘制,参考前面的文章:图像分割 - 查找图像的轮廓(cv2.findContours函数) 2、…

rk3568-一种基于wifi的网络环境搭建方案

前言&#xff1a; PC--Ubuntu--开发板 三者之间的网络互相ping通很重要&#xff0c;尤其是ubuntu和开发板互ping成功最关键&#xff0c;关系到nfs&#xff0c;tftp等常用的开发手段。现在大多数开发板都带有wifi芯片&#xff0c;现在提供一种方案可以三个设备无线地搭建网络环境…

这4款一键生成的AI写作软件值得一试

自今年初以来&#xff0c;各类AI工具如潮水般涌现&#xff0c;包括AI写作、AI绘画、AI音频处理和AI抠图等等。这些工具层出不穷&#xff0c;为我们的工作和生活带来了极大的便利。学会充分利用这些AI工具可以显著提升我们的生产效率。 软件一&#xff1a;爱制作AI 推荐指数&am…

在实训云平台上配置云主机

文章目录 零、学习目标一、实训云升级二、实训云登录&#xff08;一&#xff09;登录实训云&#xff08;二&#xff09;切换界面语言&#xff08;三&#xff09;规划云主机实例 三、创建网络三、创建路由器2024-2-29更新到此四、添加接口五、创建端口六、添加安全组规则七、创建…

一文详解CRM系统是什么?让你轻松了解CRM的全貌!

互联网上关于CRM管理系统的介绍文章各式各样&#xff0c;但是很多都是为了做品牌推广&#xff0c;并不能真正帮助读者理解CRM这一系统。这篇文章有别于您读到的其他文章&#xff0c;将从CRM系统的概念理解、常见分类、基础功能、应用阶段、发展趋势、系统定价和选型技巧这七个方…

Tomcat 下部署若依单体应用可观测最佳实践

实现目标 采集指标信息采集链路信息采集日志信息采集 RUM 信息会话重放 即用户访问前端的一系列过程的会话录制信息&#xff0c;包括点击某个按钮、操作界面、停留时间等&#xff0c;有助于客户真是意图、操作复现 版本信息 Tomcat (9.0.81)Springboot(2.6.2)JDK (>8)DDT…

mount命令最新详细教程

背景 需要在设备上面&#xff0c;自动化运行u盘里面的脚本&#xff0c;并且进入一个产测模式。因此实际使用了这个mount命令&#xff0c;所以&#xff0c;写了这么一篇供大家参考。 一. 定义 mount命令在Linux和类Unix系统中用于挂载文件系统&#xff0c;即将存储设备…

Android NDK底层BUG,记录:connect、socket(AF_INET, SOCK_STREAM, 0) 等系统套接字接口函数崩溃问题。

在 Android NDK 之中&#xff0c;看上去调用 connect、socket 函数是不会崩溃的&#xff0c;但这是否定的&#xff0c;它在特定的情况下存在必定的崩溃的问题。 但是这种情况放到MACOS、LINUX、WINDOWS都不会崩溃&#xff0c;而它崩溃的点出现在操作系统底层。 人们需要参考这…

ssm656基于JAVA的校园失物招领平台的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 课题…

计算机网络:数据链路层知识点汇总

文章目录 一、数据链路层功能概述二、封装成帧和透明传输三、差错控制&#xff08;检错编码&#xff09;四、差错控制&#xff08;纠错编码&#xff09;五、流量控制与可靠传输机制六、停止-等待协议七、后退N帧协议&#xff08;GBN&#xff09;八、选择重传协议&#xff08;SR…

一周学会Django5 Python Web开发-Django5列表视图ListView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计27条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

【ZooKeeper 】安装和使用,以及java客户端

目录 1. 前言 2. ZooKeeper 安装和使用 2.1. 使用Docker 安装 zookeeper 2.2. 连接 ZooKeeper 服务 2.3. 常用命令演示 2.3.1. 查看常用命令(help 命令) 2.3.2. 创建节点(create 命令) 2.3.3. 更新节点数据内容(set 命令) 2.3.4. 获取节点的数据(get 命令) 2.3.5. 查看…

StarRocks实战——vivo基于 StarRocks 构建实时大数据平台

目录 前言 一、数据挑战 1.1 时效性挑战&#xff0c;业务分析决策需加速 1.2 访问量挑战&#xff0c;性能与稳定性亟待提高&#xff0c;支撑业务稳定运行 1.3 计算场景挑战&#xff0c;难以满足业务复杂查询需求 1.4. 运维挑战&#xff0c;用户查询体验需优化 二、OLA…

Huggingface初上手即ERNIE-gram句子相似性实战

大模型如火如荼的今天&#xff0c;不学点语言模型&#xff08;LM&#xff09;相关的技术实在是说不过去了。只不过由于过往项目用到LM较少&#xff0c;所以学习也主要停留在直面——动眼不动手的水平。Huggingface&#xff08;HF&#xff09;也是现在搞LM离不开的工具了。 出于…

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

自动化构建平台(一)Linux下搭建私有代码仓库Gitblit的安装和使用详解

文章目录 前言一、Gitblit的安装和使用1、本地安装2、docker下安装3、Gitblit使用简介4、Gitblit仓库权限控制5、Gitblit邮件配置 总结 前言 代码版本管理&#xff0c;git模式应该是目前最流行的代码管理软件。目前支持git的管理软件有很多。 Gitblit是一个小型的代码仓库管理…

华为自动驾驶技术详解报告分享

ADS2.0首发搭载问界M5智驾版&#xff0c;城市NCA计划年底全国开通。2023年4月16日华为在智能汽车解决方案发布会上发布了最新的ADS2.0产品&#xff0c;硬件数量减少至27个(11个摄像头12个超声波雷达3个毫米波雷达1个激光雷达,ADS1.0有34个)&#xff0c;车载计算平台改为MDC610&…

手把手教你魔改YOLOv9!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文将一步步演示如何在YOLOv9中添加 / 替换新模块&#xff0c;寻找模型上的创新&#xff01; 适用检测目标&#xff1a; YOLOv9模块…