深入理解Java的Writer类

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——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类,同时实现了CloseableFlushableAppendable接口。它的继承关系如下:

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类的过滤器,它也是抽象类,其子类包括BufferedWriterPrintWriterStringWriterPipedWriter是管道的输出流,它用于跨多线程或多进程通信。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电子书籍、简历模板等海量资料。


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

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

相关文章

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…

Android Studio 检测不到 IDE 更新

点击 Configure updates...&#xff0c;不知道什么时候把 Check for IDE updates 去勾了&#xff0c;一年没有检测到更新&#xff01; 只能重新安装&#xff0c;掉坑里了&#xff01;

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯…

linuxOPS基础_linux系统注意事项

Linux严格区分大小写 Linux 和Windows不同&#xff0c;Linux严格区分大小写的&#xff0c;包括文件名和目录名、命令、命令选项、配置文件设置选项等。 例如&#xff0c;Win7 系统桌面上有文件夹叫做Test&#xff0c;当我们在桌面上再新建一个名为 test 的文件夹时&#xff0c…

Xilinx 7系列FPGA配置(ug470)

Xilinx 7系列FPGA配置&#xff08;ug470&#xff09; 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链&#xff08;非同时配置&#xff09;串行配置&#xff08;同时配置&#xff09;时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…

深入解读 Elasticsearch 磁盘水位设置

本文将带你通过查看 Elasticsearch 源码来了解磁盘使用阈值在达到每个阶段的处理情况。 跳转文章末尾获取答案 环境 本文使用 Macos 系统测试&#xff0c;512M 的磁盘&#xff0c;目前剩余空间还有 60G 左右&#xff0c;所以按照 Elasticsearch 的设定&#xff0c;ES 中分片应…

什么是ElasticSearch的深度分页问题?如何解决?

在ElasticSearch中进行分页查询通常使用from和size参数。当我们对ElasticSearch发起一个带有分页参数的查询(如使用from和size参数)时,ElasticSearch需要遍历所以匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档 在这个例子中: 1.from 参数定义…

ABAP接口-RFC连接(ABAP TO ABAP)

目录 ABAP接口-RFC连接&#xff08;ABAP TO ABAP&#xff09;创建ABAP连接RFC函数的调用 ABAP接口-RFC连接&#xff08;ABAP TO ABAP&#xff09; 创建ABAP连接 事务代码&#xff1a;SM59 点击创建&#xff0c;填写目标名称&#xff0c;选择连接类型&#xff1a; 填写主机名…

异步编程实战:使用C#实现FTP文件下载及超时控制

博客标题: 异步编程实战&#xff1a;使用C#实现FTP文件下载及超时控制 如果你的函数不是async&#xff0c;你仍然可以实现相同的超时功能&#xff0c;但你将不得不依赖更多的同步代码或使用.Result或.GetAwaiter().GetResult()来阻塞等待任务完成&#xff0c;这可能导致死锁的风…

HarmonyOS(二)Ability应用模型概述

目录 1 Ability概念 2 Ability形态 3 Stage优势 4 Stage模型结构 5 总结 注&#xff1a;本章内容提前声明。 基于HarmonyOS开发者3.1/4.0版本配套的开发者文档&#xff0c;对应API能力级别为API 9 Release。 详情可参考官网API入门第一章应用模型文档中心 1 Ability概念…

苍穹外卖学习-----2024/03/09

1.菜品分页查询 代码在这里 分页查询菜品 2.删除菜品 [链接]param 1、概览 本文将带你了解 Spring 中 RequestParam 注解的用法。 简单地说&#xff0c;可以使用 RequestParam 从请求中提取查询参数、表单参数甚至是多个参数。 2、示例端点 假设我们有一个端点 /api/foos&a…

KVM技术原理及安装KVM并且在KVM里面安装RHEL8

目录 一、kvm原理 1..1虚拟化概念 1.2 虚拟化产生背景 1.3虚拟化架构 1.4主流的虚拟化技术 1.5阐述个人对虚拟化技术的几种分类认知 二、安装KVM并且在KVM里面安装RHEL8 2.1在RHEL8主机上安装KVM 2.2安装完成后&#xff0c;使用virt-manager命令打开虚拟机管理图形界面…

Anaconda prompt运行打开jupyter notebook 指令出错解决方案

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

题目:泡澡(蓝桥OJ 3898)

问题描述&#xff1a; 解题思路&#xff1a; 图解&#xff1a;&#xff08;以题目样例为例子&#xff09; 注意点&#xff1a;题目的W是每分钟最大出水量&#xff0c;因此有一分钟的用水量大于出水量则不通过。 补充&#xff1a;差分一般用于对一段区间每个元素加相同值&#x…

Android 14 设置锁屏为NONE后开启双卡PIN锁,重启设备后,输完卡1的PIN码就进入了安卓界面,未提示输入卡2的PIN码

一.问题背景 目前在多个Android14平台发现开启双卡PIN码并且关闭屏幕锁的情况下,第二个PIN码锁输入弹框不能弹出问题,导致第二个卡不能注网。 如下是未修改前重启后解锁卡1PIN码的状态 可以看出卡2不能正常使用 二.何处关闭了卡2的PIN锁? 1.添加日志 首先在KeyguardSecu…

美团 Java 开发笔试热经

Voiceover&#xff1a; 见者有缘&#xff0c;缘来好运。欢迎大家来到我的博客【CS_GUIDER】&#xff1a;&#xff08;建议收藏至浏览器书签&#xff09; https://wlei224.gitee.io &#xff08;建议访问这个&#xff0c;速度极快&#xff09; https://wl2o2o.github.io &#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RotationGesture)

用于触发旋转手势事件&#xff0c;触发旋转手势的最少手指为2指&#xff0c;最大为5指&#xff0c;最小改变度数为1度。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 接口 RotationGesture(value?: …

Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现

场景 在业务开发中&#xff0c;需要对接三方websocket协议数据或者连接并存储线上websocket协议数据&#xff0c;需要使用websocket客户端 连接线上的websocket服务端获取并存储数据&#xff0c;然后将数据存储成文件格式可移植&#xff0c;并将数据复制 到本地&#xff0c;…

LVS----DR模式

一、LVS-DR工作原理 1、LVS-DR数据包流向分析 客户端发送请求到Director Server (负载均衡器)&#xff0c;请求的数据报文&#xff08;源IP是CIP&#xff0c;目标IP是VIP&#xff09;到达内核空间。Director Server 和Real Server 在同一个网络中&#xff0c;数据通过二层数据…

Linux 进程程序替换

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/G90eI⏪   &#x1f69a;代码仓库:Linux: Linux日常代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d;&#x1f5…