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 !!!


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

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

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

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

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

相关文章

北京邮电大学人工智能考数据结构,均分370!北京邮电大学计算机考研考情分析!

北京邮电大学(Beijing University of Posts and Telecommunications),简称北邮,是中华人民共和国教育部直属、工业和信息化部共建的全国重点大学,位列国家“211工程”、“985工程优势学科创新平台”、“世界一流学科建…

FreeBSD下使用原生虚拟机管理器bhyve

hbyve简介 自 FreeBSD 10.0-RELEASE 起,BSD 许可的 bhyve 虚拟机管理器已成为底层系统不可或缺的一部分。bhyve 强大而灵活,支持多种客户机操作系统,涵盖 FreeBSD、OpenBSD 以及多个 Linux 发行版。在默认配置下,bhyve 提供对串行…

我是个什么产品

之前的一段时间让我意识到,零碎的知识记录和发布对自己的学习和掌握来说意义不大,如果不能从基础知识开始建立生动的原理,发布这些博客只是让自己成为一个无情的背诵者。另外更可悲的一点是,会让自己误认为学会了自己发布的内容。…

Prometheus+Grafana+Alertmanager构建企业级监控系统

实验环境: Prometheusgrafanaalertmanager 安装在 k8s 集群,k8s 环境如下: k8s 集群: k8s 的控制节点 ip:192.168.200.100 主机名:master1 配置:4vCPU/4Gi 内存 k8s 的工作节点: i…

Android 14 - 绘制体系 - 概览

从Android 12开始,Android的绘制系统有结构性变化, 在绘制的生产消费者模式中,新增BLASTBufferQueue,客户端进程自行进行queue的生产和消费,随后通过Transation提交到SurfaceFlinger,如此可以使得各进程将缓…

2024年上半年系统架构设计师——案例第四题——智能汽车相关

写在前面 趁着还记得请,留个纪念。MongoDB的概念完全没记,综合下来只好选这个了。 这题基本上是有自动驾驶背景知识的人的福音,也是第一次考的和现代热点前沿技术相关的内容,而不是考些老嵌入式架构的(上一次看到的还…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…

Excel VBA快速去除Excel中的所有公式

需求 Excel表格中如果有大量的公式&#xff0c;不光会影响打开、保存的速度&#xff0c;而且在传给别人的时候也可能会出现一些小问题&#xff0c;例如链接找不到等等。那么如何快速去掉单元格内的公式呢&#xff0c;下面提供两个小技巧。 方法一 复制—粘贴—选择值 方法二…

APM2.8用USB在线下载固件

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口&#xff0c;不要选择auto&#xff0c;如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意&#xff1a;烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

关于C++智能指针复习总结

RAII(Resource Acquisition Is Initialization): 资源获得即初始化 利用对象生命周期来控制程序的资源(将资源交给对象处理) 智能指针利用了该思想 将资源交给一个对象, 初始化资源(可以是指针或者等等资源), 释放交给析构函数 因为析构函数无论是什么场景, 对象销毁时一定会…

QT C++ 模型视图结构 QTableView 简单例子

在Qt中&#xff0c;MVC模式被广泛使用于各种用户界面框架中&#xff0c;包括Qt的模型视图结构。Qt的模型视图结构是基于MVC模式设计的&#xff0c;其中包括了Model、View和Delegate三个部分。 QTableView是Qt模型视图结构中的一种视图&#xff0c;它用于以表格形式显示数据。 …

【No More Room in Hell】地狱已满服务器一键开服多人联机教程

1、购买后登录服务器 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、连接游戏 2.1、安装完成后复制开机下方的IP地址 2.2、打开Steam点击左上角的查看➡服务器 点击收藏➡右下角号 粘贴地址…

记一次由于代码原因导致Mysql连接被打满和唯一索引重复问题

先说一下事情产生的背景&#xff1a;原先的代码逻辑是消费MQ&#xff0c;然后请求其他服务的接口&#xff0c;对接口的返回值result做落库操作&#xff0c;现在要新加个逻辑&#xff0c;做完落库操作后还要再将result封装落到新表中&#xff1b;即消费一次MQ(MQ消息的频率非常高…

解决npm卡死,无法安装依赖

npm卡死&#xff0c;无法安装依赖 异常描述原因分析与解决方法 异常描述 1.无法进入命令行&#xff0c;或是很慢没反应 2.装表格无限滚动的el-table-infinite-scroll依赖一上午了&#xff0c;也不能装&#xff0c;报错提示 原因分析与解决方法 1.命令行的问题&#xff1a;缓…

RabbitMQ 之 死信队列

目录 ​编辑一、死信的概念 二、死信的来源 三、死信实战 1、代码架构图 2、消息 TTL 过期 &#xff08;1&#xff09;消费者 &#xff08;2&#xff09;生产者 &#xff08;3&#xff09;结果展示​编辑 3、队列达到最大长度 &#xff08;1&#xff09;消费者 &…

AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比

博客导读&#xff1a; 《AI—工程篇》 AI智能体研发之路-工程篇&#xff08;一&#xff09;&#xff1a;Docker助力AI智能体开发提效 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署 AI智能体研发之路-工程篇&#xff08;三&am…

3DF Zephyr v7 解锁版安装教程 (照片转三维模型软件)

前言 3DF Zephyr是一款照片转三维模型软件&#xff0c;可以导出许多常见的3D格式&#xff0c;甚至无需外部工具即可生成无损视频。此外&#xff0c;可以生成真正的正射影像&#xff0c;数字高程模型&#xff08;DTM&#xff09;&#xff0c;甚至可以计算面积&#xff0c;体积&…

软件技术架构全面详解

软件架构全面详解 软件架构 这个与建筑设计架构类似,建筑设计架构师负责设计建筑物的整体结构、布局和功能分配。 而软件架构师,负责设计软件系统的整体组织结构、模块划分、和功能分配。 两者都需要考虑到业务功能、性能、可扩展性、安全性、以及用户体验等方面。 软件架…

TypeScript 函数

函数基础 在 TypeScript 中&#xff0c;函数的定义方式与 JavaScript 类似&#xff0c;但是可以添加类型注解来增强函数的类型安全性。例如&#xff1a; function greet(name: string): string {return Hello, ${name}!; }上面的例子定义了一个名为 greet 的函数&#xff0c;…

【深度学习】ultralytics, yolo seg,实例分割图绘制,核对yolo seg 的txt标记对不对

这段代码的作用是从指定路径读取图像和标签文件&#xff0c;然后在图像上绘制分割区域和相关点&#xff0c;并保存最终的图像。以下是每个函数的具体作用及其解释&#xff1a; read_labels(label_path): 读取指定路径的标签文件。标签文件的每一行表示一个物体的分割信息&#…