`

Writer 源码分析

阅读更多
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;
}
分享到:
评论

相关推荐

    MTK_SN_IMEI_Writer+META_DLL编译源码

    MTK的SN烧写程序源码,本来已经有人上传过了,但是那个人少传了几个lib文件,我这里给补上了,放在了Release里,并带上了lib编译的源码,在23825756META_DLL_exe_v6.1320.01里

    PHP使用XMLWriter读写xml文件操作详解

    主要介绍了PHP使用XMLWriter读写xml文件操作,结合实例形式分析了php基于XMLWriter针对xml文件进行读写操作相关实现技巧,并附带相关源码供读者下载参考,需要的朋友可以参考下

    java源码文件的位置-Random-Music-Writer:编写音乐的Java程序,它使用马尔可夫链来模拟源文件。每个音符的时机和属性是根

    java原始文件的位置随机音乐作家 编写音乐的Java程序,它使用马尔可夫链来模拟源文件。...该程序使用四个命令行参数:输入音乐midi文件的位置,输出midi文件的名称,分析级别(整数)和输出长度(整数)。

    java基础案例与开发详解案例源码全

    13.3.2 Reader和Writer334 13.4 文件流336 13.4.1 FileInputStream和FileOutputStream336 13.4.2 FileReader和FileWriter338 13.5 缓冲流340 13.6 转换流341 13.7 数据流342 13.8 打印流344 13.9 对象流345 13.9.1 ...

    读者写者问题课程设计

    void W_WriterThread(void *p); int main()//主函数 { char select; while (true) { cout***************本程序实现读者-写者问题*******\n"; cout读者优先"; cout写者优先"; cout退出"; cout***********...

    C# 温故而知新:stream篇

    5.8 MemoryStream 简单示例 : XmlWriter中使用MemoryStream 5.9 MemoryStream 简单示例 :自定义一个处理图片的HttpHandler 6.1 简单介绍一下BufferedStream 6.2 如何理解缓冲区? 6.3 BufferedStream的优势 6.4 从...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 ...学生提问:当我们使用编译C程序时,不仅需要指定存放...

    java面试题以及技巧

    │ │ │ Java程序员认证模拟题及详细分析.doc │ │ │ question.rar │ │ │ test4.doc │ │ │ 模拟题.rar │ │ │ 经典的104-147模拟题.rar │ │ │ │ │ ├─035 │ │ │ 2003.10.5.15.51.43.TestKing%...

    java面试题目与技巧1

    │ │ │ Java程序员认证模拟题及详细分析.doc │ │ │ question.rar │ │ │ test4.doc │ │ │ 模拟题.rar │ │ │ 经典的104-147模拟题.rar │ │ │ │ │ ├─035 │ │ │ 2003.10.5.15.51.43.TestKing%...

    java面试题及技巧4

    │ │ │ Java程序员认证模拟题及详细分析.doc │ │ │ question.rar │ │ │ test4.doc │ │ │ 模拟题.rar │ │ │ 经典的104-147模拟题.rar │ │ │ │ │ ├─035 │ │ │ 2003.10.5.15.51.43.TestKing%...

    java面试题及技巧3

    │ │ │ Java程序员认证模拟题及详细分析.doc │ │ │ question.rar │ │ │ test4.doc │ │ │ 模拟题.rar │ │ │ 经典的104-147模拟题.rar │ │ │ │ │ ├─035 │ │ │ 2003.10.5.15.51.43.TestKing%...

    java面试题以及技巧6

    │ │ │ Java程序员认证模拟题及详细分析.doc │ │ │ question.rar │ │ │ test4.doc │ │ │ 模拟题.rar │ │ │ 经典的104-147模拟题.rar │ │ │ │ │ ├─035 │ │ │ 2003.10.5.15.51.43.TestKing%...

Global site tag (gtag.js) - Google Analytics