C# StringReader
最后修改于 2025 年 4 月 20 日
本教程解释了如何在 C# 中使用 StringReader 类来读取和处理字符串数据。StringReader 提供了按字符或逐行读取字符串的方法。
StringReader 类实现了一个从字符串读取的 TextReader。它提供了与 StreamReader 类似的方法,但直接使用字符串。
当您需要逐行或逐字符处理字符串数据时,StringReader
非常有用。它通常与 StringWriter 一起用于构建字符串。
StringReader 基本示例
此示例演示了 StringReader 的基本用法,即按字符读取字符串。
using System; using System.IO; class Program { static void Main() { string text = "Hello StringReader"; using (StringReader reader = new StringReader(text)) { int character; while ((character = reader.Read()) != -1) { Console.Write((char)character); } } } }
该示例从一个字符串创建一个 StringReader,并按字符读取它。当到达字符串末尾时,Read()
方法返回 -1。在此示例中,我们使用字符串 "Hello StringReader" 初始化一个 StringReader
。
while 循环继续读取字符,直到 Read()
返回 -1。每个字符在打印之前都转换为 char。这演示了 StringReader 的基本逐字符读取功能。
使用 StringReader 读取行
StringReader 可以逐行读取字符串,这对于处理多行文本非常有用。
using System; using System.IO; class Program { static void Main() { string lines = "First line\nSecond line\nThird line"; using (StringReader reader = new StringReader(lines)) { string line; int count = 1; while ((line = reader.ReadLine()) != null) { Console.WriteLine($"Line {count}: {line}"); count++; } } } }
当没有更多行可用时,ReadLine()
方法返回 null。此示例显示了如何处理多行字符串。输入字符串包含三行,由换行符分隔。
StringReader
使用 ReadLine()
顺序读取每一行,这会自动处理换行符。行计数器演示了如何在处理过程中跟踪行号。
读取字符块
StringReader 可以将字符块读取到数组中,这对于处理大型字符串非常有效。
using System; using System.IO; class Program { static void Main() { string text = "The quick brown fox jumps over the lazy dog"; using (StringReader reader = new StringReader(text)) { char[] buffer = new char[10]; int charsRead; while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0) { Console.WriteLine($"Read {charsRead} chars: " + new string(buffer, 0, charsRead)); } } } }
Read(char[], int, int)
方法将字符读取到缓冲区数组中。它返回实际读取的字符数。此示例演示了以 10 个字符的块读取字符串。
缓冲区数组临时存储从 StringReader 读取的字符。charsRead
变量跟踪每次操作中实际读取的字符数。这种方法对于大型字符串来说是内存高效的。
预览字符
StringReader 允许使用 Peek()
方法预览下一个字符而不消耗它。
using System; using System.IO; class Program { static void Main() { string text = "ABC123"; using (StringReader reader = new StringReader(text)) { int peek = reader.Peek(); Console.WriteLine($"Peeked: {(char)peek}"); int read = reader.Read(); Console.WriteLine($"Read: {(char)read}"); } } }
就像 Read()
一样,Peek()
在字符串末尾返回 -1。此示例显示了预览和读取之间的区别。Peek()
方法允许查看下一个字符而不推进读取器的位置。
第一个字符 'A' 被预览,但仍然可以读取。随后的 Read()
然后消耗相同的字符。这对于解析字符串时的前瞻操作非常有用。
组合 StringReader 和 StringWriter
StringReader 通常与 StringWriter 一起用于字符串处理管道。
using System; using System.IO; using System.Text; class Program { static void Main() { string input = "line1\nline2\nline3"; using (StringReader reader = new StringReader(input)) using (StringWriter writer = new StringWriter()) { string line; while ((line = reader.ReadLine()) != null) { writer.WriteLine(line.ToUpper()); } Console.WriteLine("Processed output:"); Console.WriteLine(writer.ToString()); } } }
此示例从 StringReader 读取行,处理它们(转换为大写),然后写入 StringWriter。StringReader
逐行读取输入字符串。每一行都转换为大写并写入 StringWriter
。
StringWriter
将处理后的行累积在其内部 StringBuilder
中。最后,使用 ToString()
检索完整的处理后的字符串。这演示了一种常见的文本处理管道模式。
读取到字符串末尾
ReadToEnd()
方法读取从当前位置到字符串末尾的所有剩余字符。
using System; using System.IO; class Program { static void Main() { string text = "First part\nSecond part\nThird part"; using (StringReader reader = new StringReader(text)) { // Read and discard first line reader.ReadLine(); // Read remaining content string remaining = reader.ReadToEnd(); Console.WriteLine("Remaining content:"); Console.WriteLine(remaining); } } }
此示例读取并丢弃第一行,然后读取整个剩余内容。ReadLine()
调用跳过第一行。然后 ReadToEnd()
读取从当前位置到末尾的所有剩余文本。
当您需要在处理主要内容之前跳过文本数据中的标题或前言时,此方法很有用。该方法对于读取大量剩余文本非常有效。
处理空字符串
此示例演示了 StringReader 如何处理空字符串和不同的读取方法。
using System; using System.IO; class Program { static void Main() { string empty = ""; string whitespace = " "; Console.WriteLine("Testing empty string:"); TestReader(empty); Console.WriteLine("\nTesting whitespace string:"); TestReader(whitespace); } static void TestReader(string input) { using (StringReader reader = new StringReader(input)) { Console.WriteLine($"Read(): {reader.Read()}"); Console.WriteLine($"Peek(): {reader.Peek()}"); Console.WriteLine($"ReadLine(): {reader.ReadLine() ?? "null"}"); Console.WriteLine($"ReadToEnd(): \"{reader.ReadToEnd()}\""); } } }
该示例显示了 StringReader 方法在空字符串和空白字符串中的返回值。对于空字符串,Read()
和 Peek()
立即返回 -1。ReadLine()
返回 null,ReadToEnd()
返回一个空字符串。
对于空白,Read()
返回第一个空格字符,Peek()
在不推进的情况下执行相同的操作,ReadLine()
返回空白字符串,ReadToEnd()
返回整个空白字符串。这演示了边缘情况的行为。
来源
本教程介绍了使用 StringReader 在 C# 中读取字符串数据,包括逐字符读取、行读取和块读取技术。
作者
列出所有 C# 教程。