`

Reader 源码分析

阅读更多
  读取字符流的抽象类。子类需要重写read(char[], int, int)和close()方法。很多子类会重写该类的非抽象方法以获得更好的性能或(和)额外的功能。


public abstract class Reader implements Readable, Closeable {
	// 用来在流上同步操作的对象。为了提高效率,字符流对象可以使用其自身以外的对象来保护关键部分。因此,子类应使用此字段中的对象,而不是 this 或者同步的方法。
	protected Object lock;

	// 其重要部分将同步其自身的reader
	protected Reader() {
		this.lock = this;
	}

	// 其重要部分将同步给定的对象
	protected Reader(Object lock) {
		if (lock == null) {
			throw new NullPointerException();
		}
		this.lock = lock;
	}

	// 试图将字符读入指定的字符缓冲区。缓冲区可照原样用作字符的存储库:所做的唯一改变是 put操作的结果。不对缓冲区执行翻转或重绕操作。
	public int read(java.nio.CharBuffer target) throws IOException {
		int len = target.remaining();
		char[] cbuf = new char[len];
		int n = read(cbuf, 0, len);
		if (n > 0)
			target.put(cbuf, 0, n);
		return n;
	}

	// 读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。子类可以重写该方法提升性能
	public int read() throws IOException {
		char cb[] = new char[1];
		if (read(cb, 0, 1) == -1)
			return -1;
		else
			return cb[0];
	}

	// 将字符读入数组,调用三个参数的read方法
	public int read(char cbuf[]) throws IOException {
		return read(cbuf, 0, cbuf.length);
	}

	// 将字符读入数组的某一部分。在某个输入可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞
	abstract public int read(char cbuf[], int off, int len) throws IOException;

	// 最大的跳过缓冲区大小
	private static final int maxSkipBufferSize = 8192;

	// 跳过缓冲区
	private char skipBuffer[] = null;

	// 跳过字符。在一些字符可用、发生 I/O 错误或者到达流的末尾前,此方法一直阻塞。
	public long skip(long n) throws IOException {
		if (n < 0L) 
			throw new IllegalArgumentException("skip value is negative");
		int nn = (int) Math.min(n, maxSkipBufferSize);
		synchronized (lock) {
			if ((skipBuffer == null) || (skipBuffer.length < nn))
				skipBuffer = new char[nn];
			long r = n;
			while (r > 0) {
				int nc = read(skipBuffer, 0, (int)Math.min(r, nn));
				if (nc == -1)
					break;
				r -= nc;
			}
			return n - r;
		}
	}

	// 判断此流是否已经准备好用于读取。
	// 如果保证下一个 read() 不阻塞输入,则返回 True,否则返回 false。注意,返回 false 并不保证阻塞下一次读取。
	public boolean ready() throws IOException {
		return false;
	}

	// 判断此流是否支持mark操作。默认返回false,子类要重写该实现。
	public boolean markSupported() {
		return false;
	}

	// 标记流中的当前位置。对 reset() 的后续调用将尝试将该流重新定位到此点。并不是所有的字符输入流都支持 mark() 操作。
	public void mark(int readAheadLimit) throws IOException {
		throw new IOException("mark() not supported");
	}

	// 重置该流。如果已标记该流,则尝试在该标记处重新定位该流。如果未标记该流,则以适用于特定流的某种方式尝试重置该流,例如,通过将该流重新定位到其起始点。
	// 并不是所有的字符输入流都支持 reset() 操作,有些支持 reset() 而不支持 mark()。
	public void reset() throws IOException {
		throw new IOException("reset() not supported");
	}
	
	// 关闭该流并释放与之关联的所有系统资源。关闭该流后,再调用 read()、ready()、mark()、reset() 或 skip() 将抛出 IOException。关闭以前关闭的流无效。
	abstract public void close() throws IOException;
}
分享到:
评论

相关推荐

    Java BufferedWriter BufferedReader 源码分析

    本文是关于Java BufferedWriter ,BufferedReader 简介、分析源码 对Java IO 流深入了解,希望看到的同学对你有所帮助

    基于Android的SimpleReader小说阅读器设计源码

    本源码提供了一个基于Android的SimpleReader小说阅读器设计。项目包含128个文件,其中包括56个XML文件、45个Java源文件、9个PNG图片、3个Gradle文件、2个Gitignore文件、2个IML文件、2个JAR文件、2个Properties文件...

    基于朴素贝叶斯的豆瓣Top250影评的情感分析与预测 附完整源码和数据.zip

    基于朴素贝叶斯的豆瓣Top250影评的情感分析与预测 附完整源码和数据.zip 首先需要豆瓣Top250影评的语料,我用Scrapy抓取了5w份语料,用于训练与验证。 豆瓣影评爬虫 github.com/3inchtime/d… 有了语料之后我们就...

    spring2.5.6源码

    rar包内含有spring2.5.6源码,解压即可使用 源代码分析,是一件既痛苦又快乐的事情,看别人写的代码是通过的,但当你能够看明白的时候,相信快乐也会随之而来,为了减少痛苦,更快的带来快乐,在这里希望通过这篇...

    java8集合源码分析-javaLearner:java学习者

    集合源码分析 java-reader 【Java入门 -&gt; 进大厂笔记:open_book::ledger:】未来的你一定会感谢今天学习的自己! 本项目主打Java基础、算法、框架实战、源码、中间件、大数据、面试等知识积累和经验总结。文章共300多...

    Android代码-Tachiyomi漫画阅读器

    Configurable reader with multiple viewers, reading directions and other settings MyAnimeList, AniList, and Kitsu support Categories to organize your library Light and dark themes Schedule updating ...

    fbreader-android-reader.rar_ FBReader_android_fbreader_阅读器 安卓_阅读

    开源软件开发实践课程-fbreader安卓阅读器-详细源码-源码分析-详细相关文档

    Java 中的FileReader和FileWriter源码分析_动力节点Java学院整理

    本文给大家分享一段示例程序,通过示例代码可以看出FileReader是基于InputStreamReader实现的,FileWriter是基于OutputStreamWriter实现的,具体程序代码大家通过本文了解下吧

    java安卓辅助源码-reader:毕业设计-基于智能手机的报纸阅读器

    java安卓辅助源码 毕业设计-reader 基于智能手机的报纸阅读器 应用背景: 老年人由于视力衰退,标题大,阅读没问题,但报道内容文字较小,阅读困难,如果有人帮他读他感兴趣的内容,这个问题就可以得到解决。 使用...

    Android系统源代码情景分析-罗升阳-源码

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载...

    Android系统源代码情景分析光盘

    Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................

    spring源代码解析

    而一般的启动过程,Spring会使用一个默认的实现,XmlWebApplicationContext – 这个上下文实现作为在web容器中的根上下文容器被建立起来,具体的建立过程在下面我们会详细分析。 Java代码 public class ...

    TSReader源码

    Ts流读取和截取PSI/SI工具,思路与其他TS流分析软件不同(需先装控件,D7开发)。 由于CSDN不能修改,故跟进的版本,查http://hi.baidu.com/aszfjopagxgiotr/item/132260d1a2404cde3dc2cbbe

    电子标签读写器UHFReader18 2.1.zip

    电子标签读写器UHFReader18演示了对ISO18000-6B,6C标准的RFID条码进行操作的所有...读写数据/字节块永久写保护标签频点分析界面操作(打开端口之后) 注意事项:1、开发环境为Visual Studio2010,使用.net2.0开发。

    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 ...

    毕业设计-图书管理系统(源代码+说明)

    本程序前后端分离,用户界面部分与数据管理部分没有耦合,因此可以方便地更换为各种不同类型的前端界面。...然后就要考虑该类型与其它类型之间的关联,通过分析需求可以知道,借书操作更多地与借书者相关。

    基于python+Django+MYSQL实现的图书管理系统.zip

    资源包含文件:论文word文档+需求分析+可行性分析+接口文档+工作日志+项目源码及数据库文件+项目截图 我们开发的管理系统它是基于Django框架,web技术,建立以Reader/Manager为结构模式、以数据库为后台核心应用、以...

    Numerical Recipes - The Art of Scientific Computing(3rd)【数值分析方法库

    Numerical Recipes - The Art of Scientific Computing(3rd)【数值分析方法库pdf】无水印 ...pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Visual C++音频视频处理技术及工程实践地址

    附件中德PDF请用Adoble PDF Reader打开,测试成功版本为11.00 分卷文件共有以下2个: Visual.Cpp音频视频处理技术及工程实践.haozip01.zip Visual.Cpp音频视频处理技术及工程实践.haozip02.zip 为了更方便的合并...

    leetcode下载--:——

    leetcode下载 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ 网络 操作系统 算法 面向对象 数据库 Java 分布式 工具 编码实践 ...容器的一些总结,包含容器源码的分析。 File, InputStream OutputStream, Reader W

Global site tag (gtag.js) - Google Analytics