Java之Writer类:探索Java中的输出流

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在Java中,当我们需要将字符或字符串写入到文件或其他输出流时,就可以使用Writer类来实现。Writer类是Java.io包中的一个抽象类,提供了一系列方法,可以用来写入字符或字符串到输出流中。本文将介绍Writer类的相关知识,包括源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。

摘要

本文将介绍Java中的Writer类,包括源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。

Writer类

简介

Writer类是Java.io包中的一个抽象类,用来将字符或字符串写入到输出流中。Writer类继承了Java.io.Writer类的一些方法,并添加了一些新的方法来实现字符和字符串的输出。Writer类是抽象类,不能直接使用,需要使用他的子类对象来操作输出流。

Writer类的常用子类有:

  • FileWriter:用于将字符或字符串写入文件中。
  • StringWriter:用于将字符或字符串写入到字符串缓冲区中。

源代码解析

以下是Writer类的源代码:

public abstract class Writer implements Appendable, Closeable, Flushable {
    protected Object lock;

    protected Writer() {
        this.lock = this;
    }

    protected Writer(Object lock) {
        if (lock == null) {
            throw new NullPointerException();
        } else {
            this.lock = lock;
        }
    }

    public void write(int c) throws IOException {
        synchronized(this.lock) {
            this.writeImpl(new char[]{(char)c}, 0, 1);
        }
    }

    public void write(char[] cbuf) throws IOException {
        synchronized(this.lock) {
            this.writeImpl(cbuf, 0, cbuf.length);
        }
    }

    public abstract void write(char[] var1, int var2, int var3) throws IOException;

    public void write(String str) throws IOException {
        synchronized(this.lock) {
            this.writeImpl(str.toCharArray(), 0, str.length());
        }
    }

    public void write(String str, int off, int len) throws IOException {
        synchronized(this.lock) {
            this.writeImpl(str.toCharArray(), off, len);
        }
    }

    public Writer append(CharSequence csq) throws IOException {
        if (csq == null) {
            this.write("null");
        } else {
            this.write(csq.toString());
        }

        return this;
    }

    public Writer append(CharSequence csq, int start, int end) throws IOException {
        CharSequence cs = csq == null ? "null" : csq;
        this.write(cs.subSequence(start, end).toString());
        return this;
    }

    public Writer append(char c) throws IOException {
        this.write(c);
        return this;
    }

    abstract void writeImpl(char[] var1, int var2, int var3) throws IOException;

    public void flush() throws IOException {
        synchronized(this.lock) {
            this.flushBuffer();
        }
    }

    public void close() throws IOException {
        synchronized(this.lock) {
            if (this.isOpen()) {
                this.flushBuffer();
            }

            this.closeImpl();
        }
    }

    void flushBuffer() throws IOException {
    }

    boolean isOpen() {
        return true;
    }

    void closeImpl() throws IOException {
    }
}

以上是Writer类的源代码,他提供了一系列方法,可以用来写入字符或字符串到输出流中。

这是一个抽象类 Writer,实现了 Appendable, Closeable, Flushable 三个接口。它的作用是提供一个通用的写操作接口,它的实现类可以用于写入不同类型的数据到不同的目标,如文件、流等。

该类有两个构造方法,一个是无参构造函数,另一个是传入一个 lock 对象的构造函数。它们用于指定该类在写操作时需要使用的锁对象。

该类有多个 write() 方法,用于将数据写入目标。其中,最常用的方法是 write(char[] cbuf, int off, int len),用于将指定的字符数组 cbuf 的子数组(从 off 开始,长度为 len)写入到目标。

另外,该类还实现了 Appendable 接口,提供了 append() 方法,可以将指定的字符序列或字符写入到目标中。在将字符序列转换为字符数组后,它调用了 writeImpl(char[] var1, int var2, int var3) 方法实现了写操作。

在写操作时,该类采用了同步的方式,即使用 synchronized 关键字保证了多线程环境下的数据安全。此外,该类还实现了 flush()close() 方法用于刷新缓冲区和关闭流,它们同样采用了同步的方式。其中,closeImpl() 方法是子类可以覆盖的方法,用于关闭流。

  如下是部分源码截图:

在这里插入图片描述

应用场景案例

Writer类主要用于将字符或字符串写入输出流中,常用的子类包括FileWriter和StringWriter。下面是一些应用场景案例:

  • 将字符串写入文件中:
  FileWriter writer = new FileWriter("output.txt");
  writer.write("hello world");
  writer.close();
  • 将字符数组写入文件中:
  char[] chars = {'h', 'e', 'l', 'l', 'o'};
  FileWriter writer = new FileWriter("output.txt");
  writer.write(chars);
  writer.close();
  • 将字符串写入字符串缓冲区中:
  StringWriter writer = new StringWriter();
  writer.write("hello world");
  String str = writer.toString();

优缺点分析

Writer类的优点包括:

  • 可以将字符或字符串快速地写入到输出流中。
  • 提供了一系列方法,可以满足不同的写入需求。

Writer类的缺点包括:

  • 由于是抽象类,不能直接使用,需要使用它的子类对象来操作输出流。
  • 在写入过程中可能会出现IO异常,需要进行异常处理。

类代码方法介绍

Writer类的常用方法介绍:

  • write(int c):将一个字符写入输出流中。
  • write(char[] cbuf):将一个字符数组写入输出流中。
  • write(char[] cbuf, int off, int len):将一个字符数组中从off位置开始的len个字符写入输出流中。
  • write(String str):将一个字符串写入输出流中。
  • write(String str, int off, int len):将一个字符串中从off位置开始的len个字符写入输出流中。
  • append(CharSequence csq):将一个CharSequence对象追加到输出流中。
  • append(CharSequence csq, int start, int end):将CharSequence对象中从start位置开始到end位置的字符追加到输出流中。
  • append(char c):将一个字符追加到输出流中。
  • flush():刷新输出流。
  • close():关闭输出流。

测试用例

以下是针对Writer类的一个简单测试用例:

package com.example.javase.se.classes;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Author ms
 * @Date 2023-11-05 18:39
 */
public class WriterTest {

    private static final String FILENAME = "test.txt";

    public static void main(String[] args) {
        String strToWrite = "hello world";
        try (FileWriter writer = new FileWriter(FILENAME)) {
            writer.write(strToWrite);
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String strFromFile = "";
        try (FileReader reader = new FileReader(FILENAME)) {
            char[] buffer = new char[1024];
            int length = reader.read(buffer);
            strFromFile = new String(buffer, 0, length);
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (strToWrite.equals(strFromFile.trim())) {
            System.out.println("The test passed.");
        } else {
            System.out.println("The test failed.");
        }
    }
}

以上测试用例创建了一个名为output.txt的文件,并将字符串“hello world”写入到该文件中。然后,从该文件中读取出刚刚写入的字符串,并与预期字符串进行比较,如果相等,则表示测试通过。

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

这段代码演示了如何使用Java的FileWriter和FileReader类写入和读取文件。具体来说,代码中定义了一个常量FILENAME,表示要进行读写的文件名为test.txt。

在main方法中,首先设置要写入文件的字符串strToWrite,然后使用try-with-resources语句创建一个FileWriter对象,并调用其write方法写入字符串。最后,使用flush方法将缓冲区中的内容刷新到文件中。

接下来,代码中使用try-with-resources语句创建一个FileReader对象,并使用read方法读取文件中的内容。读取过程中将内容存储到一个字符数组buffer中,然后根据读取的长度创建一个新的字符串strFromFile。

最后,代码比较写入的字符串strToWrite和从文件中读取的字符串strFromFile是否一致,如果一致则输出"The test passed.“,否则输出"The test failed.”。

在这里插入图片描述

小结

本文介绍了Java中的Writer类,该类主要用于将字符或字符串写入到输出流中,是Java.io包中的一个抽象类。Writer类的常用子类有FileWriter和StringWriter,在应用场景中可以将字符串或字符数组写入文件或字符串缓冲区。本文详细介绍了Writer类的源代码解析、应用场景案例、优缺点分析以及类代码方法介绍。最后,本文给出了一个针对Writer类的简单测试用例。

总结

本文介绍了Java中的Writer类,该类是Java.io包中的一个抽象类,用于将字符或字符串写入到输出流中。Writer类的常用子类有FileWriter和StringWriter,在应用场景中可以将字符串或字符数组写入文件或字符串缓冲区。本文详细介绍了Writer类的源代码解析、应用场景案例、优缺点分析以及类代码方法介绍。同时,本文还提供了一个针对Writer类的简单测试用例。通过本文的学习,读者可以更好地熟悉和掌握Writer类的使用。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在CentOS 8上卸载与安装MySQL 8的详细步骤

关键词:MySQL 8安装、CentOS 8、YUM源配置、卸载MySQL、MySQL残留文件删除、首次登录MySQL临时密码、服务状态检查、MySQL社区服务器 阅读建议:本文适合需要在CentOS 8操作系统上部署最新MySQL 8数据库的系统管理员或开发者阅读。文中步骤简洁清晰&#…

Spring+SpringBoot面试总结(近两万字)

SpringSpringBoot面试总结 一、Spring Bean1.1、bean的生命周期(对象的创建使用销毁)1.1.1、准备工作1.1.2、创建Bean对象1.1.3、注册销毁 1.2、 bean的作用域1.2.1、配置方式 1.3、 spring 自动装配 bean 有哪些方式(存疑存疑)1.…

452. 用最少数量的箭引爆气球(中等)

452. 用最少数量的箭引爆气球 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:452. 用最少数量的箭引爆气球 2.详细题解 引爆所有气球,弓箭数要最少,那么每支弓箭尽量多的引爆气球,采用贪心策略。对于…

基于小波熵阈值的心电信号R波检测算法(MATLAB)

心脏兴奋电活动过程可由心电信号(ECG)来反映,心电信号也是医学上对心血管疾病诊断的重要科学依据。心电信号具有一定的随机性且一般情况下十分微弱,在信号采集、放大及变换过程中,心电信号容易受到人体呼吸及检测仪器等因素影响,从…

在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据

系列文章目录 在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据 在ARM开发板上,栈大小设置为2MB(常用设置)里面存放的数据 系列文章目录 在ARM开发板上,栈(Stack)…

linux下cp和mv命令显示进度条

1.查看当前系统下coreutils工具包的版本号: [rootk8s-master ~]# rpm -qa | grep -w coreutils coreutils-8.22-24.el7_9.2.x86_64当前版本为8.22。 因为cp 和 mv 命令由 coreutils 软件包提供,所以需要重新下载 coreutils 软件包配置补丁 2.下载core…

148.栈与队列:前K个高频元素(力扣)

代码解决 class Solution { public:// 自定义比较类,用于优先队列(小顶堆)class mycomparison{public:// 重载操作符,用于比较两个pair,基于pair的第二个值(频率)bool operator()(const pair&l…

网页图片加载慢的求解指南

网页/图片加载慢的求解指南 一、前言与问题描述 今天刚换上华为的HUAWEI AX3 Pro New,连上WIFI后测速虽然比平时慢,但是也不算太离谱,如下图所示: 估计读者们有也和作者一样,还没意识到事情的严重性😁。 …

UE_地编教程_创建地形洞材质

个人学习笔记,不喜勿喷。侵权立删! 使用地形洞材质来遮罩地形上特定位置的可视性和碰撞。如要在山脉侧面创建进入洞穴的入口,此操作将非常有用。可使用地形材质和地形洞材质的相同材质,但注意:对比不使用不透明蒙版的…

基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务

部署前准备: Cloudflare 账号 https://dash.cloudflare.com/login CloudDNS 账号 https://www.cloudns.net/ GitHub 账号 https://github.com/Harry-zklcdc/go-proxy-bingai Cloudflare 部署 Worker CloudDNS 获取免费二级域名 GitHub New Bing Ai 项目 https://git…

Linux系统硬盘分区

文章目录 一、硬盘和分区1.1 硬盘的概念1.2 硬盘分区的类别1.3 硬盘分区的方式1.3.1 MBR分区1.3.2 GPT分区 1.4 硬盘分区的意义1.4.1 分区的作用1.4.2 分区的缺点 二、如何建立分区2.1 分区命令2.1.1 fdisk命令2.1.2 gdisk命令 2.2 建立分区2.2.1 建立MBR分区建立主分区建立扩展…

电脑如何在网页上下载视频 浏览器如何下载网页视频

对于现代职场人士而言,在日常生活中难免需要下载各种短视频,IDM下载加速器可以轻松获取抖音、快手等平台的无水印短视频文件。 Internet Download Manager,简称IDM。功能强大的网络下载器。您不需要多余的操作,IDM 能捕获您的下载…

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一:模拟支付宝蚂蚁森林的能量产生过程 支付宝的蚂蚁森林通过日常的走步、生活缴费、线下支付、网络购票、共享单车等低碳、环保行为…

行为设计模式之策略模式

文章目录 概述原理结构图 代码实现小结 概述 策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。 在软件开发中也会遇到相似的情况&…

【Lexus.4】Executive Sedan——Dismantling Follow-up

文章目录 【碰撞测试】前后防撞钢梁偏置碰撞A/B/C柱,边梁抗拉、屈服强度 【底盘】平整度护板(发动机,底盘)前副车架结构前悬架形式后悬架形式与材质簧下质量 【发动机】【轮上马力】【零部件供应商】 来自2021《懂车大爆炸》——是…

操作系统课程实验1-进程调度模拟实验

操作系统课程实验1-进程调度模拟实验 一、实验介绍 1.1 实验目的 本实验模拟在单处理机环境下的处理机调度,帮助理解进程调度的概念,深入了解进程控制块的功能,以及进程的创建、撤销和进程各个状态间的转换过程。 1.2 实验内容 进程调度算…

md是什么?如何打开md类型的文件?假如使用Typora打开,如何免费激活Typora?

md是什么?如何打开md类型的文件 前言一、md是什么简介常见打开md类型文件的方法使用文本编辑器使用专用Markdown编辑器使用在线Markdown编辑器在浏览器中安装插件打开 二、下载安装Typora三、免费激活Typora激活Typora关闭软件每次启动时的已激活弹窗去除软件左下角…

动手学深度学习4.6 暂退法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:丢弃法_哔哩哔哩_bilibili 本节教材地址:4.6. 暂退法(Dropout)…

NDIS驱动程序堆栈

NDIS 6.0 引入了暂停和重启驱动程序堆栈的功能。 若要支持 NDIS 6.0 提供的堆栈管理功能,必须重写旧版驱动程序。 NDIS 6.0 还引入了 NDIS Filter驱动程序。 Filter驱动程序可以监视和修改协议驱动程序与微型端口驱动程序之间的交互。 与 NDIS 5 相比,F…

188M2传奇BLUEM2引擎源码开源版附带编译教程2024最新开源

2024最新开源188M2传奇BLUEM2引擎源码开源2版最初开源版本附带编译教程 源码下载地址:极速云 如果需要优惠可以选择第一版最初开源188M2传奇BLUEM2引擎源码开源1版最初开源版本附带编译教程2024最新开源