Writer是写入字符流的抽象类。子类必须实现的方法有 write(char[], int, int)、flush() 和 close()。
public abstract class Writer implements Appendable, Closeable, Flushable {
// 字符缓冲区
private char[] writeBuffer;
// 缓冲区大小
private final int writeBufferSize = 1024;
// 锁对象
protected Object lock;
// 默认构造函数,指定锁对象为流本身
protected Writer() {
this.lock = this;
}
// 使用提供的锁对象来同步重要操作
protected Writer(Object lock) {
if (lock == null) {
throw new NullPointerException();
}
this.lock = lock;
}
// 写入单个字符。c的低16位会被写入,高16位被忽略。
public void write(int c) throws IOException {
synchronized (lock) {
if (writeBuffer == null){
writeBuffer = new char[writeBufferSize];
}
writeBuffer[0] = (char) c;
write(writeBuffer, 0, 1);
}
}
// 写入字符数组
public void write(char cbuf[]) throws IOException {
write(cbuf, 0, cbuf.length);
}
// 抽象方法,由子类来实现
abstract public void write(char cbuf[], int off, int len) throws IOException;
// 写入字符串
public void write(String str) throws IOException {
write(str, 0, str.length());
}
// 写入字符串的一部分
public void write(String str, int off, int len) throws IOException {
synchronized (lock) {
char cbuf[];
if (len <= writeBufferSize) {
if (writeBuffer == null) {
writeBuffer = new char[writeBufferSize];
}
cbuf = writeBuffer;
} else {
cbuf = new char[len];
}
str.getChars(off, (off + len), cbuf, 0);
write(cbuf, 0, len);
}
}
// 将指定字符序列添加到此writer
//可能不添加整个序列,也可能添加,具体取决于字符序列 csq 的 toString 规范。例如,调用一个字符缓冲区的 toString 方法将返回一个子序列,其内容取决于缓冲区的位置和限制。
public Writer append(CharSequence csq) throws IOException {
if (csq == null)
write("null");
else
write(csq.toString());
return this;
}
// 将指定字符添加到此writer
public Writer append(char c) throws IOException {
write(c);
return this;
}
// 刷新 Writer 和 OutputStream 链中的所有缓冲区
//如果此流的预期目标是由底层操作系统提供的一个抽象(如一个文件),则刷新该流只能保证将以前写入到流的字节传递给操作系统进行写入,但不保证能将这些字节实际写入到物理设备(如磁盘驱动器)。
abstract public void flush() throws IOException;
// 关闭此流,但要先刷新它。在关闭该流之后,再调用 write() 或 flush() 将导致抛出 IOException。关闭以前关闭的流无效。
abstract public void close() throws IOException;
}