.NET中TextReader.ReadLine()的Read()与Peek()方法重写机制
TextReader的Read()与Peek()方法重写逻辑(针对Console.ReadLine场景)
TextReader作为抽象基类,其默认的Peek()和Read()方法仅返回-1(表示无可用数据),但Console.ReadLine()依赖的是Console.In对应的TextReader子类实例,这个子类重写了两个方法来实现实际的控制台输入读取:
重写Read()方法:
该方法会与系统控制台输入API交互,从用户输入流中读取单个字符的UTF-16码位(返回int类型)。当有用户输入字符时,返回对应字符的编码值;仅当输入流结束(比如按下Ctrl+Z)时,才返回-1。重写Peek()方法:
该方法实现了"预读不消耗"的逻辑:查询控制台输入缓冲区的下一个可用字符,返回其UTF-16码位,但不会移动读取指针(即该字符会保留在缓冲区中,供后续Read()读取)。如果没有可用字符(用户未输入或流结束),则返回-1。
TextReader.ReadLine()的工作流程:
- 循环调用Peek()检查是否有可用字符;
- 当Peek()返回非-1值时,调用Read()读取字符并缓存;
- 直到Peek()检测到换行符(
\n)或流结束,将缓存的字符拼接为字符串返回。
内容的提问来源于stack exchange,提问作者Alexander Summers
相关产品推荐
相关产品推荐

