`

StringReader 源码分析

阅读更多
public class StringReader extends Reader {
    private String str;
    private int length;
    private int next = 0;
    private int mark = 0;

    // 创建一个新字符串 reader
    public StringReader(String s) {
	this.str = s;
	this.length = s.length();
    }

    // 如果字符串为null,说明已经被关闭了,抛异常
    private void ensureOpen() throws IOException {
	if (str == null)
	    throw new IOException("Stream closed");
    }

    // 读取单个字符。如果已到达流的末尾,则返回 -1
    public int read() throws IOException {
	synchronized (lock) {
	    ensureOpen();
	    if (next >= length)
		return -1;
	    return str.charAt(next++);
	}
    }

    // 从当前字符串中读取指定数量的字符,放到字符数组中。
    public int read(char cbuf[], int off, int len) throws IOException {
	synchronized (lock) {
	    ensureOpen();
            if ((off < 0) || (off > cbuf.length) || (len < 0) ||
                ((off + len) > cbuf.length) || ((off + len) < 0)) {
                throw new IndexOutOfBoundsException();
            } else if (len == 0) {
                return 0;
            }
	    if (next >= length)
		return -1;
	    int n = Math.min(length - next, len);
	    str.getChars(next, next + n, cbuf, off);
	    next += n;
	    return n;
	}
    }

    // 跳过流中指定数量的字符。返回跳过的字符数。
    public long skip(long ns) throws IOException {
	synchronized (lock) {
            ensureOpen();
            if (next >= length)
                return 0;
            // Bound skip by beginning and end of the source
            long n = Math.min(length - next, ns); // 当ns为正数时
            n = Math.max(-next, n); // 当ns为负数时
            next += n;
            return n;
        }
    }

    // 判断此流是否已经准备好用于读取。
    public boolean ready() throws IOException {
        synchronized (lock) {
        ensureOpen();
        return true;
        }
    }

    // 判断此流是否支持 mark() 操作。
    public boolean markSupported() {
	return true;
    }

    // 标记流中的当前位置。对reset的后续调用会将该流重新定位到此点。
    public void mark(int readAheadLimit) throws IOException {
	if (readAheadLimit < 0){
	    throw new IllegalArgumentException("Read-ahead limit < 0");
	}
	synchronized (lock) {
	    ensureOpen();
	    mark = next;
	}
    }

    // 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
    public void reset() throws IOException {
	synchronized (lock) {
	    ensureOpen();
	    next = mark;
	}
    }

    // 关闭该流并释放与之关联的所有系统资源。在关闭该流后,再调用 read()、ready()、mark() 或 reset() 将抛出 IOException。关闭以前关闭的流无效。
    // 这里的实现是将字符串的引用赋为null。
    public void close() {
	str = null;
    }
}
分享到:
评论

相关推荐

    Java rt.jar 源码分析

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

    Java BufferedWriter BufferedReader 源码分析

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

    Spring源码分析

    ### Spring源码分析:IOC容器深入解读 #### 一、Spring框架及IOC容器的重要性 Spring框架作为Java领域中最重要的企业级应用开发框架之一,自2004年发布以来一直备受开发者们的青睐。Spring框架的核心功能包括:...

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

    Java中的InputStreamReader和OutputStreamWriter源码分析 InputStreamReader是Java中用于将字节输入流转换成字符输入流的类,它继承自Reader类。下面是InputStreamReader的源码分析: 构造方法 InputStreamReader...

    系统解析JDK源码,领略大牛设计思想,JAVA进阶必备(2023新课,已完结)

    9. **字符串处理**:String类的不可变性、StringBuilder和StringBuffer的使用,以及字符串池的概念,都是通过源码分析可以深入理解的内容。 10. **类加载机制**:双亲委派模型、自定义类加载器,这些都是JVM层面的...

    opencsv源码

    **OpenCSV 源码分析** OpenCSV 是一个开源的 Java 库,专门用于处理 CSV(Comma Separated Values)格式的数据。它为开发者提供了一种简单、高效的接口,使得生成和读取 CSV 文件变得非常方便。在Java开发中,处理...

    java类源码-Java-basic-test:Java基础类库源码分析测试用

    这个"Java-basic-test"项目显然专注于Java基础类库的源码分析与测试,这对于深入理解Java的工作原理、学习面向对象编程以及提升编程技能都非常有帮助。下面将详细讨论Java类库中的关键知识点。 1. **Java基础类库**...

    spring2.5.6源码

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

    Spring ioc源码解读

    通过对Spring IoC容器的理解和源码分析,我们可以深入了解到Spring框架是如何管理和控制应用对象的生命周期及依赖关系的。在实际开发中,了解Spring IoC容器的工作原理有助于更好地利用Spring框架,提高开发效率和...

    rt.jar源码

    2. 错误排查:当遇到运行时异常或不正常行为时,源码分析有助于找出问题所在,提高调试效率。 3. 深度学习:源码阅读有助于深入理解Java语言特性,比如反射、多线程、内存管理等,提升开发者的技术深度。 4. 自定义...

    获取网页源码_代码下载

    string sourceCode = reader.ReadToEnd(); Console.WriteLine(sourceCode); } } } } ``` 3. **使用HttpClient(ASP.NET 4.5及以上版本)**: 对于较新的.NET版本,`System.Net.Http.HttpClient`提供了更...

    java根据网址获取源码

    ### Java根据网址获取源码 在Java开发过程中,有时候我们需要从网络上获取特定网页的源代码来进行分析或者处理。这通常涉及到HTTP请求的发送与响应的处理。下面将详细介绍如何利用Java来实现这一功能。 #### 核心...

    http请求工具源码

    4. **处理响应**:我们可以读取响应体,比如`using (StreamReader reader = new StreamReader(response.GetResponseStream())) { string responseText = reader.ReadToEnd(); }`,将响应内容转化为字符串。 5. **...

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

    public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fileName)); } ``` 2. **FileWriter** 类似地,`FileWriter`在构造时,将文件名或`FileDescriptor`传递给`...

    源码统计程序

    "源码统计程序"就是一个专门用于这类分析的工具。在C#编程语言中,我们可以利用它的强大特性和丰富的类库来实现这样的功能。 首先,C#是一种面向对象的编程语言,它继承了C++的静态类型系统和Java的简洁语法,特别...

    数据存储源码

    在Android开发中,数据存储是不可或缺的一部分,它用于持久化应用程序的数据,以便在应用程序关闭后仍然可以访问。这个“数据存储源码”提供了...通过分析这个源码,初学者可以更好地理解和实践Android的数据存储功能。

    dom4j -1.6.1 源码 dom4j -1.6.1 源码

    **四、源码分析** 1. **Element类**: 源码中,Element类实现了许多接口,如`Node`, `AttributeList`, `NamespaceSupport`等,这使得Element可以直接操作属性、子元素和命名空间。`addElement()`和`removeElement()`...

    C#获取html页面源码

    string encoding = webResponse.CharacterSet ?? "UTF-8"; using (System.IO.StreamReader reader2 = new StreamReader(stream, Encoding.GetEncoding(encoding))) { return reader2.ReadToEnd(); } ``` - **`...

Global site tag (gtag.js) - Google Analytics