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

news2024/9/19 13:42:56

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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 !!!


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

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

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

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

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

相关文章

拿捏数据结构-top_k问题

top_k问题时间复杂度的计算 这里提前说明,时间复杂度的计算的目的是来计算向上调整的更优还是向下调整更优,从肉眼看的话向下调整优于向上调整,接下来我们进行时间复杂度的计算。 此时我们会用到等比数列求和以及裂项相消 如图 首先我们假设求…

【物联网实战项目】STM32C8T6+esp8266/mqtt+dht11+onenet+uniapp

一、实物图 前端uniapp效果图(实现与onenet同步更新数据) 首先要确定接线图和接线顺序: 1、stm32c8t6开发板连接stlinkv2下载线 ST-LINK V2STM323.3V3.3VSWDIOSWIOSWCLKSWCLKGNDGND 2、ch340串口连接底座(注意RXD和TXD的连接方式…

Spring Boot集成shiro之使用redis缓存demo

1.背景 上次发了这篇文章《Spring Boot集成Shiro快速入门Demo》后,有网友“just.blue”后台反馈集成redis有点问题,今天特地把集成过程发出来 2.为什么要使用cache 用来减轻数据库的访问压力,从而提升查询效率。 3.Shiro使用Redis做缓存 …

Go 实现 WebSocket 的双向通信

在Go语言中实现WebSocket的双向通信通常需要使用第三方库,其中 gorilla/websocket 是一个非常流行和广泛使用的库。 1、安装 go get github.com/gorilla/websocket 2、编写WebSocket服务器代码 package mainimport ("fmt""github.com/gorilla/we…

AlibabaCloud(阿里云)支付方式介绍,使用虚拟卡支付阿里云

一、支付方式 二、 添加支付方式 点击添加支付方式按钮,您将进入添加支付方式流程。选择您偏好的支付方式,按页面指导进行添加即可。 1、信用卡 可以使用Fomepay的信用进行支付,点击获取 依次输入您银行卡的卡号、有效期、安全码&#xff…

实现一个简单的 Google Chrome 扩展程序

目录 🧭 效果展示 # 图示效果 a. 拓展程序列表图示效果: b. 当前选项卡页面右键效果: c. 拓展程序消息提示效果: 📇 项目目录结构 # 说明 # 结构 # 文件一览 ✍ 核心代码 # manifest.json # background.j…

JWT-登录后下发令牌

后端 写一个jwt工具类,处理令牌的生成和校验,如: 响应数据样例: 前端要做的:

Nginx文件解析漏洞复现:CVE-2013-4547

漏洞原理 CVE-2013-4547漏洞是由于非法字符空格和截止符导致Nginx在解析URL时的有限状态机混乱,导致攻击者可以通过一个非编码空格绕过后缀名限制。假设服务器中存在文件1. jpg,则可以通过改包访问让服务器认为访问的为PHP文件。 漏洞复现 开启靶场 …

均值算法详细教程(个人总结版)

背景 均值算法,也称为平均值算法,是统计分析中的基本方法之一。它通过求取一组数据的平均值来概括数据的集中趋势。在数据分析、机器学习、信号处理等领域,均值算法被广泛应用。 均值的种类 算术均值(Arithmetic Mean&#xff…

手把手教你快速玩转香橙派AIPro

什么是香橙AIPro? OrangePi AIpro(8T)采用昇腾AI技术路线,具体为4核64位处理器AI处理器,集成图形处理器,支持8TOPS AI算力,拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持…

设计模式 19 模板模式 Template Pattern

设计模式 19 模板模式 Template Pattern 1.定义 模板模式(Template Pattern)是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。在模板模式中,定义了一个抽象类,其中包含了一个…

2024.5组队学习——MetaGPT(0.8.1)智能体理论与实战(中):订阅智能体OSS实现

传送门: 《2024.5组队学习——MetaGPT(0.8.1)智能体理论与实战(上):MetaGPT安装、单智能体开发》《2024.5组队学习——MetaGPT(0.8.1)智能体理论与实战(下)&…

2024年电工杯高校数学建模竞赛(A题) 建模解析| 园区微电网风光储协调优化配置

问题重述及方法概述 问题1:各园区独立运营储能配置方案及其经济性分析 经济性分析采用成本-效益分析方法,计算购电量、弃风弃光电量、总供电成本和单位电量平均供电成本等指标。 问题2:联合园区储能配置方案及其经济性分析 经济性分析采用成…

《Ai企业知识库》-rasa X安装使用

背景: Rasa X 是一个为构建、改进和管理对话式AI助手而设计的工具。它是Rasa开源机器学习框架的一个扩展,旨在实现“对话驱动开发”(Conversation-Driven Development)。Rasa X 主要特点包括: 交互式学习:…

百度智能小程序源码系统 关键词推广优化排名高 带完整的安装代码包以及搭建教程

系统概述 百度智能小程序源码系统是一套完整的解决方案,为用户提供了创建、发布和管理智能小程序的平台。它基于百度平台的先进技术,确保小程序在运行和展示方面具有出色的表现。 代码示例 系统特色功能 1.关键词推广优化:系统内置了强大的…

Day 40 Web容器-Tomcat

Tomcat 一:Tomcat简介 1.简介 ​ Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目 ​ Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器 ​ Tomcat是WEB容器/WE…

JVM(内存区域划分、类加载机制、垃圾回收机制)

目录 一. 内存区域划分 1.本地方法栈(Native Method Stacks) 2.虚拟机栈(JVM Stacks) 3.程序计数器(Program Counter Register) 4.堆(Heap) 5.元数据区(Metaspace) 二.类加载机制 1.加载 2.验证 3.准备 4.解析 5.初始化 "双亲委派模型" 三. GC 垃圾回收…

[自动驾驶技术]-7 Tesla自动驾驶方案之算法(AI Day 2022)

特斯拉在2022年AI Day上更新了感知规控算法模型,核心引入了Occupancy技术。下图是特斯拉活动日展示的主题内容,本文主要解读Planning和Neural Network部分。 1 规划决策 Interaction search-交互搜索 特斯拉在自动驾驶规划中使用了一种高度复杂和优化的…

SpringCloud整合Seata1.5.2

Windows下部署Seata1.5.2可参照博文&#xff1a;Windows下部署Seata1.5.2&#xff0c;解决Seata无法启动问题-CSDN博客 1. 引入依赖 <!-- 分布式事务 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-st…

echarts配置记录,一些已经废弃的写法

1、normal&#xff0c;4.0以后无需将样式写在normal中了 改前&#xff1a; 改后&#xff1a; DEPRECATED: normal hierarchy in labelLine has been removed since 4.0. All style properties are configured in labelLine directly now. 2、axisLabel中的文字样式无需使用te…