`

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

相关推荐

    android RssReader源码.rar

    【Android RssReader源码分析】 在Android应用开发中,RSS阅读器是一种常见的应用类型,它允许用户订阅和浏览各种网站的RSS(Really Simple Syndication) feed,获取最新的新闻、博客文章或者其他信息。"android ...

    基于ppc的CHMReader源码

    《基于ppc的CHMReader源码解析》 在信息技术领域,阅读和处理CHM(Microsoft Compiled HTML Help)文件是一项常见的需求。CHM文件是一种压缩的电子书格式,广泛用于技术文档、帮助文件等。本篇文章将深入探讨一个...

    reader_android源码_

    源码分析将帮助我们深入理解这一功能的内部机制。 1. **项目结构** Android应用通常遵循MVP(Model-View-Presenter)或MVVM(Model-View-ViewModel)架构模式。源码中,我们可以看到不同的目录和文件,分别对应着...

    android pdf reader 阅读器源码

    "android pdf reader 阅读器源码"提供了这样一个平台,让你能够深入理解PDF阅读器的工作原理,以及如何在Android环境中实现这样的功能。源代码是开发者学习新技能、改进现有项目的宝贵资源,特别是对于初学者,它...

    android rss_reader 源码 学习

    【Android RSS_Reader 源码学习】 在Android开发中,RSS阅读器是一个常见的应用,它可以帮助用户订阅和浏览各种网站的RSS(Really Simple Syndication) feed,获取最新的新闻、博客文章或者其他信息。本源码学习...

    ios-iOS电子书阅读器reader.zip

    3. **自动章节提取**:程序能智能地分析并提取EPUB文件中的章节信息,使用户可以轻松浏览书籍目录,快速定位到想要阅读的部分。 4. **用户界面与交互设计**: - **翻页模式**:提供了多种翻页效果,模拟真实的翻书...

    adobe reader插件开发示例程序

    Adobe Reader是一款广泛使用的PDF文档阅读器,而Adobe Reader插件开发则是为了扩展其功能,满足用户个性化需求。这篇博文提供了一个adobe reader插件开发的示例程序,可以帮助开发者了解和学习如何创建自定义插件。 ...

    Android应用源码SimpleReader-rss聚合阅读器

    通过学习和分析SimpleReader的源码,开发者不仅可以掌握Android应用开发的基本技能,还能了解到如何处理网络数据、优化UI性能、实现用户交互和提高应用的可维护性。这对于提升个人技能和开发更复杂的Android项目具有...

    pageturner-reader完整源码

    ** Pageturner Reader 完整源码分析 ** PageTurner 是一款开源的电子书阅读器,其核心功能是解析并展示EPUB格式的电子书。这个项目利用了`epublib-core`库来实现对EPUB文件的处理。本文将深入探讨PageTurner的源码...

    CSV Reader

    标签“源码”意味着我们可能会看到一些实际的代码示例,这将有助于理解CSV读取的实现细节。而“工具”可能指的是除了纯编程方式外,还会有推荐的一些第三方库或命令行工具,如`pandas`在Python中的应用,或者像是`...

    Text Reader 2.0(源码)

    通过分析源码,开发者不仅可以了解Text Reader 2.0的实现细节,还可以学习到如何在 Delphi 中实现文件操作、历史记录管理、用户界面设计等技巧,进一步提升自己的编程能力。同时,这款软件的开源性质鼓励了社区参与...

    SimpleReader-rss聚合阅读器Android应用源码

    通过对SimpleReader源码的学习,开发者可以提升自己在Android应用开发中的网络通信、数据解析、UI设计以及数据管理等多方面技能,这对于任何希望深入Android开发的工程师来说都是宝贵的资源。同时,这也为自定义RSS...

    Android Reader For Google(源码实例)

    源码分析: 1. **Android SDK使用**:此项目使用了特定版本的Android SDK,通过源码我们可以研究如何根据Android API来构建应用,包括Activity管理、Intent通信、UI设计等方面。 2. **布局设计**:`google.android...

    Android 按键消息流程源码分析

    ### Android按键消息流程源码分析 #### 一、概述 在Android系统中,键盘按键事件的管理和处理是一项关键任务。整个流程涉及多个层次,从硬件层的Linux内核驱动到应用层的应用程序,其间还包括了Android框架层。...

    PDF阅读器源码_pdfreader.zip

    PDF阅读器源码_pdfreader.zip这个压缩包文件包含的是一份PDF阅读器的源代码,这对于想要学习PDF处理、理解PDF阅读器工作原理或者想要开发自己PDF应用的开发者来说是宝贵的资源。PDF(Portable Document Format)是一...

    Android应用源码SimpleReader-rss聚合阅读器.zip

    《Android应用源码SimpleReader-rss聚合阅读器...通过分析和学习这个源码,开发者能深入理解Android应用开发的流程和技术细节,提升自己的编程技能。同时,对于想要了解RSS聚合原理的人来说,这是一个很好的实践案例。

    手机阅读“宝”——Apabi Reader for Android

    作为一款源码工具,Apabi Reader for Android不仅提供了一种便捷的阅读方式,还为开发者提供了深入学习和定制的可能性。 一、Apabi Reader for Android的核心功能 1. 高质量阅读体验:Apabi Reader支持多种格式的...

    Java BufferedWriter BufferedReader 源码分析

    源码分析通常会涉及这些方法的具体实现,包括如何管理缓冲区,何时从底层流读取数据,以及如何处理行结束符等。 综上所述,BufferedWriter和BufferedReader是Java IO流中的重要组件,它们通过内部缓冲机制提升了IO...

    epub格式阅读器源码

    源码分析可以从以下几个方面展开: 1. **文件结构解析**:Epub阅读器首先需要解析Epub文件的OPF(Open Package Format)文件,这是Epub的核心元数据文件,包含书籍的信息如标题、作者、内容目录等。此外,NCX...

    Java rt.jar 源码分析

    源码分析对于深入理解Java平台的工作原理、优化代码性能以及进行二次开发具有重要的价值。 rt.jar中的源码虽然默认并未提供,但可以通过一些工具,如JDK的`src.zip`或者使用OpenJDK的源码仓库来获取。这些源码提供...

Global site tag (gtag.js) - Google Analytics