欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

字符流(一)Reader和Writer源码理解

程序员文章站 2022-04-30 15:26:05
...

1.Reader

1.1 继承关系

public abstract class Reader implements Readable, Closeable{}
//下面是两个接口所需要实现的类
public interface Readable {
    public int read(java.nio.CharBuffer cb) throws IOException;
}
public interface Closeable {
    public void close() throws IOException;
}

1.2 部分方法

     //两个未实现的方法
     abstract public void close() throws IOException;
     abstract public int read(char cbuf[], int off, int len) throws IOException;
    //一个对象锁,这个会在构造方法中进行赋值。
    protected Object lock;
    protected Reader() {
	this.lock = this;
    }
    //这个锁会在skip方法中出现
    synchronized (lock) {
    //这里是读操作,读多少个字符。还有判断可能文件尾
    }

1.3 锁的基本介绍

上面方法中用到的锁在使用时,使用不带锁的方法是不受影响的,只有两个方法同时带锁才会受影响.

下面是写的一个例子,了解锁起到的作用。

public static void main(String args[]) throws Exception {
	final Object w = new Object();
	Thread t = new Thread() {
		public void run() {
			try {
				System.out.println("线程开始,先休息0.01s,这样可以保证主线程的锁先启动");
				Thread.sleep(10);
				System.out.println(w+"这里可以表明使用w对象的方法的");
				System.out.println("等待主线程的同步块完成");
				synchronized (w) {
					System.out.println("进入线程同步块");
					Thread.sleep(1000);
					System.out.println("线程同步结束");
				}
				System.out.println("线程结束");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	};
	t.start();
	synchronized (w) {
		System.out.println("主线程的同步开始");
		Thread.sleep(1000);
		System.out.println("主线程的同步结束");
	}
}

//输出结果:
主线程的同步开始
线程开始,先休息0.01s,这样可以保证主线程的锁先启动
java.lang.Object@1fb8ee3这里可以表明使用w对象的方法的
等待主线程的同步块完成
主线程的同步结束
进入线程同步块
线程同步结束
线程结束 

2.Writer

2.1 继承关系

public abstract class Writer implements Appendable, Closeable, Flushable {}
public interface Appendable {
    Appendable append(CharSequence csq) throws IOException;
    Appendable append(CharSequence csq, int start, int end) throws IOException;
    Appendable append(char c) throws IOException;
}
//其他两个接口就不需要看了。

2.2 部分方法

首先是看一看append方法

    //很明显是直接写入了。
    public Writer append(CharSequence csq) throws IOException {
	if (csq == null)
	    write("null");
	else
	    write(csq.toString());
    	return this;
    }

再看看几个抽象方法

    abstract public void write(char cbuf[], int off, int len) throws IOException;

    abstract public void flush() throws IOException;

    abstract public void close() throws IOException;

2.3 与锁有关的

关于写操作的内容都会加锁。

3.结束

希望继续关注字符流的其他类