theme: healer-readable
highlight: a11y-dark
哈喽,各位小伙伴们,你们好呀,我是喵手。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在Java中,当我们需要将字符或字符串写入到文件或其他输出流时,就可以使用Writer类来实现。Writer类是Java.io包中的一个抽象类,提供了一系列方法,可以用来写入字符或字符串到输出流中。本文将介绍Writer类的相关知识,包括源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。
摘要
本文将介绍Java中的Writer类,包括源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。
Writer类
简介
Writer类是Java.io包中的一个抽象类,用来将字符或字符串写入到输出流中。Writer类继承了Java.io.Writer类的一些方法,并添加了一些新的方法来实现字符和字符串的输出。Writer类是抽象类,不能直接使用,需要使用他的子类对象来操作输出流。
Writer类的常用子类有:
- FileWriter:用于将字符或字符串写入文件中。
- StringWriter:用于将字符或字符串写入到字符串缓冲区中。
源代码解析
以下是Writer类的源代码:
代码语言:java复制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类的一个简单测试用例:
代码语言:java复制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.");
}
}
}
以上测试用例创建了一个名为test.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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!