咦咦咦,各位小可爱,我是你们的好伙伴——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电子书籍、简历模板等海量资料。