深入探讨Java中的OutputStreamWriter类

915 阅读8分钟

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

在这里插入图片描述


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

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

前言

  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电子书籍、简历模板等海量资料。