当前位置: 首页 > news >正文

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电子书籍、简历模板等海量资料。


相关文章:

Java的Writer类详解

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...

R语言基础的代码语法解译笔记

1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而package name::funct…...

【蓝桥杯】蓝桥杯算法复习(一)

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…...

移动端精准测试简介

在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...