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类,同时实现了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类的优点和缺点如下:
优点
-
Writer类提供了一系列的方法用于写入字符数据,具有很高的灵活性。
-
Writer类可以将字符转换成字节并写入到输出流中。
-
Writer类可以方便地将数据写入文件、网络流等。
缺点
-
Writer类在写操作时,需要使用
synchronized锁实现线程安全,可能会影响程序的性能。 -
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 类将文本写入文件。
具体解释如下:
- 导入需要使用的包:
import java.io.*;
-
创建一个类并定义一个静态方法main,在main方法中使用
try-catch语句捕获可能产生的IOException异常。 -
创建FileWriter对象,并指定要写入的文件路径。实例化 FileWriter 对象的时候,可以使用相对路径或者绝对路径,这里使用了"./template/fileTest.txt"相对路径表示法。
FileWriter writer = new FileWriter("./template/fileTest.txt");
- 调用 write() 方法将要写入的字符串写入文件。
writer.write("hello world,jym!!!");
-
关闭
FileWriter对象,调用close()方法是为了释放该文件的句柄资源,关闭写文件操作。 -
在 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电子书籍、简历模板等海量资料。

相关文章:
Java的Writer类详解
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...
R语言基础的代码语法解译笔记
1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而package name::funct…...
【蓝桥杯】蓝桥杯算法复习(一)
😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!Ǵ…...
移动端精准测试简介
在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,WebUI, AppUI自动化,然后就是测试平台的开发,各类专项测试(性能,安全),再到前几年的手机集群云测平…...
CCProxy代理服务器地址的设置步骤
目录 前言 一、下载和安装CCProxy 二、启动CCProxy并设置代理服务器地址 三、验证代理服务器设置是否生效 四、使用CCProxy进行代理设置的代码示例 总结 前言 CCProxy是一款常用的代理服务器软件,可以帮助用户实现网络共享和上网代理。本文将详细介绍CCProxy…...
探秘分布式神器RMI:原理、应用与前景分析(二)
本系列文章简介: 本系列文章将深入探究RMI远程调用的原理、应用及未来的发展趋势。首先,我们会详细介绍RMI的工作原理和基本流程,解析其在分布式系统中的核心技术。随后,我们将探讨RMI在各个领域的应用,包括分布式计算…...
[项目设计] 从零实现的高并发内存池(三)
🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…...
将Q算法和D算法结合应用到llm解码上之人在回路
将Q算法和D算法结合应用到llm解码上之人在回路 参考地址代码解释 参考地址 https://dongfangyou.blog.csdn.net/article/details/136466609 代码 import numpy as np from tqdm import tqdmfrom sample import net, char2id_dict, get_real_p# 假设的词汇表 VOCABULARY lis…...
el-table-column嵌套el-form-item不能进行校验问题解决
项目为vue3elementPlus开发的项目 业务要求:table表格展示数据,其中有一行是ip地址可展示可修改,此处要求增加自定义校验规则 先看一下效果: 此处先描述一下,问题出在了哪里,我将el-table的data,使用一个…...
leetcode200. 岛屿数量
leetcode200. 岛屿数量 题目 思路 遍历每一个网格,若网格为1,岛屿数量1,利用一个深度优先搜索函数将岛屿置零,注意判断数组边界 代码 class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.grid grid…...
MySQL--索引类型详解
索引的类型 主键索引: PRIMARY KEY,当一张表的某个列是主键的时候,该列就是主键索引,一张表只允许有一个主键索引,主键所在的列不能为空。 创建主键索引的SQL语法: # 给user表中的id字段创建名为id_ind…...
R语言中ggplot2图例位置、颜色、背景、标题
目录 1、不显示图例 2、自定义图例位置 3、修改图例背景颜色、外框颜色、大小 4、修改图例大小 5、图例设置背景、线框为空 6、自定义设置多个图例的标题 7、设置多个图例的之间的间隔 8、取消不需要的图例显示 1、不显示图例 theme(legend.position "none"…...
波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发
原文:https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译:OneBlock 区块链领域不断发展,随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …...
公网IP与私有IP及远程互联
1.公网有私有IP及NAT 公网IP是全球唯一的IP,通过公网IP,接入互联网的设备是可以访问你的设备。但是IPV4资源有限,一般ISP(Internet Service Provider)并不会为用户提供公网IP。所以家里的计算机在公司是没法直接使用windows远程桌面直接访问…...
openCV xmake debug失效 release可以使用
在使用xmake构建一个项目时,添加openCV库,调用 imread函数时,debug函数失效, release可以使用,最后发现是xmake.lua写的有问题 option("OpenCV4.6.0")set_showmenu(true) set_default(true) set_category(&…...
ES分布式搜索-IK分词器
ES分词器-IK 1、为什么使用分词器? es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 我们在kibana的DevTools中测试: GET /_analyze {"analyzer": "…...
基于卷积神经网络的野外可食用植物分类系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细探讨了一基于深度学习的可食用植物图像识别系统。采用TensorFlow和Keras框架,利用卷积神经网络(CNN)进行模型训练和预测,并引入迁移学习模型…...
Raingad IM即时聊天/即时通讯网站源码,附带系统搭建教程
支持功能 支持单聊和群聊,支持发送表情、图片、语音、视频和文件消息单聊支持消息已读未读的状态显示,在线状态显示群聊创建、删除和群成员管理、群公告、群禁言等支持置顶联系人,消息免打扰;支持设置新消息声音提醒,…...
for语句的实际应用(3)
3145:【例24.3】 奇数求和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9847 通过数: 5442 【题目描述】 计算非负整数 m 到 n(包括 m 和 n)之间的所有奇数的和,其中,m 不大于 n,且 n 不大…...
c++ Windows获取软件安装列表信息
链接 #include <windows.h> #include <stdio.h> #include <iostream> #include <vector>using namespace std;#ifndef MSVCR #define _T #define _tcscpy strcpy #define _stprintf sprintf #define _tcscmp strcmp #endifclass SetupSoftInfo { publ…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
