小工具知识网

当前位置: 首页 > 行业知识 > 深入理解Java的Writer类

行业知识

深入理解Java的Writer类

2026-11-12 01:04:52 来源:互联网转载

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


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

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

文章目录

  • 前言
  • 摘要
  • `Writer`类
    • 概述
    • 源代码解析
    • 应用场景案例
      • 将数据写入文件
      • 将数据在控制台输出
      • 优缺点分析
        • 优点
        • 缺点
        • 类代码方法介绍
        • 测试用例
          • 测试结果
          • 代码解析
          • 全文小结
          • 附录源码
          • 总结
          • ☀️建议/推荐你
          • 关于我

            前言

              在Java开发中,我们经常需要进行文件的读写操作。Java中提供了几种不同的类来实现文件的读写功能,其中Writer类是其中之一。在本文中,我们将深入探讨Writer类的实现以及应用场景。

            摘要

              本文旨在介绍Java中Writer类的实现以及应用场景。我们将会分析Writer类的源代码,通过案例来介绍Writer类的应用场景,并对其进行优缺点分析。最后,我们将会介绍Writer类的常用方法以及测试用例,最终总结本文的内容。

            Writer类

            概述

              Writer类是Java中用于写入字符流的抽象类。它是所有写入字符流类的基类,包括了字符输出流和字节输出流。Writer类提供了一系列的方法来写入字符数据,可以将字符转换成字节并写入到输出流中。

              其中它继承了java.lang.Object类,同时实现了Closeable、Flushable和Appendable接口。它的继承关系如下:

            java.lang.Object         |         |     java.io.Writer         |         |------java.io.OutputStreamWriter         |         |------java.io.CharArrayWriter         |         |------java.io.FilterWriter         |                |         |                |------java.io.BufferedWriter         |                |         |                |------java.io.PrintWriter         |                |         |                |------java.io.StringWriter         |         |         |------java.io.PipedWriter         |         |------java.io.Writer

              其中,OutputStreamWriter类继承于Writer,它是将字符流转换为字节流的桥梁。CharArrayWriter类同样继承于Writer,它是一个字符数组输出流。FilterWriter类是Writer类的过滤器,它也是抽象类,其子类包括BufferedWriter、PrintWriter和StringWriter。PipedWriter是管道的输出流,它用于跨多线程或多进程通信。Writer类本身也继承于自己,这是为了方便其他类继承Writer类而设计的。

            源代码解析

              Writer类的源代码相对简单,其主要实现了flush()、close()、write(char cbuf[])、write(char cbuf[], int off, int len)和write(String str)等方法。

            下面是Writer类部分源代码的解析:

            public abstract class Writer implements Appendable, Closeable, Flushable {    private char[] writeBuffer;    private static final int WRITE_BUFFER_SIZE = 1024;    private String lineSeparator;    protected Object lock;    protected Writer() {        this.lock = this;        this.writeBuffer = new char[WRITE_BUFFER_SIZE];        this.lineSeparator = java.security.AccessController.doPrivileged(                new sun.security.action.GetPropertyAction("line.separator"));    }    public void write(char c[]) throws IOException {        write(c, 0, c.length);    }    public void write(char c[], int off, int len) throws IOException {        synchronized (lock) {            int bOff = 0;            while (len > 0) {                if (writeBuffer == null || len >= writeBuffer.length) {                    implWrite(c, off + bOff, len);                    return;                }                if (bOff + len > writeBuffer.length) {                    flushBuffer();                }                int n = Math.min(writeBuffer.length - bOff, len);                System.arraycopy(c, off + bOff, writeBuffer, bOff, n);                bOff += n;                len -= n;            }        }    }    public void write(String str) throws IOException {        write(str, 0, str.length());    }}

              以上代码中,我们可以看出Writer类中定义了字符数组writeBuffer和字符串lineSeparator。在构造函数中,初始化了writeBuffer和lineSeparator两个成员变量。

              在write(char c[])方法中,调用write(char c[], int off, int len)方法,并传入数组长度等参数。在write(char c[], int off, int len)方法中,使用synchronized锁保证线程安全,在while循环中不断将字符数组中的元素写入输出流中。

            部分源码截图如下展示:

            应用场景案例

              Writer类在Java开发中有广泛的应用场景。以下是Writer类应用场景的一些案例:

            将数据写入文件

            以下示例展示了如何使用Writer类将数据写入文件:

            package com.example.javase.io.writer;import java.io.FileWriter;import java.io.IOException;/** * @author bug菌 * @version 1.0 * @date 2023/10/19 16:38 */public class WriterTest {    public static void main(String[] args) {        try {            FileWriter writer = new FileWriter("./template/fileTest.txt");            writer.write("ello world,jym!!!");            writer.close();        } catch (IOException e) {            e.printStackTrace();        }    }}

              在上述示例中,我们创建了FileWriter对象,并使用它将字符串写入fileTest.txt文件中。

            如上案例测试结果如下:

            将数据在控制台输出

              使用Writer类可以将字符输出到控制台。可以使用OutputStreamWriter类将字符流转换为字节流,然后使用PrintWriter类将数据写入控制台。

            以下示例展示了如何使用Writer类将数据输出到控制台,代码如下:

                //将数据在控制台输出    public static void testFilePrint() {        Writer writer = new OutputStreamWriter(System.out);        PrintWriter printWriter = new PrintWriter(writer);        printWriter.println("Hello World!");        printWriter.flush();        printWriter.close();    }    public static void main(String[] args) {        testFilePrint();    }

            如上案例测试结果如下:

            除了以上场景案例外,还有其他的应用场景,比如:

            • 网络编程:在网络编程中,Writer类可用于将字符流写入Socket或OutputStream。可以使用OutputStreamWriter类将字符流转换为字节流,然后使用BufferedWriter将数据写入输出流。
            • 数据库写入:在数据库编程中,Writer类可用于将字符写入数据库字段。可以使用PreparedStatement类来创建Writer对象,然后使用setCharacterStream()方法将数据写入数据库字段。

              优缺点分析

              Writer类的优点和缺点如下:

              优点

              1. Writer类提供了一系列的方法用于写入字符数据,具有很高的灵活性。

              2. Writer类可以将字符转换成字节并写入到输出流中。

              3. Writer类可以方便地将数据写入文件、网络流等。

              缺点

              1. Writer类在写操作时,需要使用synchronized锁实现线程安全,可能会影响程序的性能。

              2. Writer类的效率与底层的操作系统以及硬件有关。

              类代码方法介绍

              Writer类中一些常用的方法如下:

              方法名作用
              void flush() throws IOException该方法将缓冲区中的数据写入到目标输出流中。
              void close() throws IOException该方法关闭输出流并释放与其相关的资源。
              void write(char cbuf[]) throws IOException该方法接收一个字符数组并将其写入到输出流中。
              void write(char cbuf[], int off, int len) throws IOException该方法接收一个字符数组、一个偏移量和一个长度,从偏移量开始,写入指定长度的字符到输出流中。
              void write(String str) throws IOException该方法接收一个字符串,并将其写入到输出流中。

                如上就是我自认为Writer类的一些常用方法,如果你想了解更多,可以去专研下它的源码,绝对收获颇多。

              测试用例

              以下是一个测试用例,用于演示Writer类的使用:

              public class WriterTest {    public static void main(String[] args) {        try {            FileWriter writer = new FileWriter("output.txt");            writer.write("Hello World!");            writer.close();            System.out.println("Write Successfully!");        } catch (IOException e) {            e.printStackTrace();        }    }}

                在该测试用例中,我们创建了FileWriter对象,并使用它将字符串写入fileTest.txt文件中。最后,输出Write Successfully!,表示数据写入成功。

              测试结果

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

              代码解析

                针对如上测试用例,我这里做个代码分析,以帮助大家更快的理解并运用它,该测试用例主要是演示如何使用 FileWriter 类将文本写入文件。

              具体解释如下:

              1. 导入需要使用的包:
              import java.io.*;
              1. 创建一个类并定义一个静态方法main,在main方法中使用 try-catch 语句捕获可能产生的IOException异常。

              2. 创建FileWriter对象,并指定要写入的文件路径。实例化 FileWriter 对象的时候,可以使用相对路径或者绝对路径,这里使用了"./template/fileTest.txt"相对路径表示法。

              FileWriter writer = new FileWriter("./template/fileTest.txt");
              1. 调用 write() 方法将要写入的字符串写入文件。
              writer.write("hello world,jym!!!");
              1. 关闭 FileWriter 对象,调用close() 方法是为了释放该文件的句柄资源,关闭写文件操作。

              2. 在 catch 块中打印异常信息。

              全文小结

                本文介绍了Java中的Writer类,包括其实现、应用场景、优缺点分析和常用方法等。我们还演示了如何使用Writer类将数据写入文件和网络流中。

              附录源码

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

              总结

                Writer类是Java中用于写入字符流的抽象类。它提供了一系列的方法用于写入字符数据,具有很高的灵活性。但是,Writer类需要使用synchronized锁实现线程安全,可能会影响程序的性能。在实际开发中,我们可以根据具体情况选择使用Writer类或其他类来完成文件的读写操作。

              ☀️建议/推荐你


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

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

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

              关于我

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


上一篇:哈工大计算机系统大作业-程序人生-Hello’s P2P

下一篇:看门狗功能深度解析,守护安全与稳定的必备机制