TextReader以及TextWriter这两个类,非常有用,很多方法都接受它们作为参数。
TextReader有两个子类:
- StringReader/StringWriter 用于读取字符串;
- StreamReader/StreamWriter 用于读取流;
一、StringReader的作用
StringReader主要用于读取字符串。
常用方法如下:
成员 | 说明 |
Close | 关闭 StringReader |
Peek | 返回下一个可用的字符,但不使用它 |
Read | 读取输入字符串中的下一个字符并将该字符的位置提升一个字符,重载可提升任意个字符 |
ReadAsync | 读取字符的指定最大数量从当前字符串异步和数据写入缓冲区,从指定索引处开始 |
ReadBlock | 从当前文本读取器中读取指定数目的字符并从指定索引开始将该数据写入缓冲区 |
ReadBlockAsync | 读取字符的指定最大数量从当前字符串异步和数据写入缓冲区,从指定索引处开始 |
ReadLine | 读取一行字符从当前字符串并将数据作为字符串返回 |
ReadLineAsync | 读取一行字符异步从当前字符串并将数据作为字符串返回 |
ReadToEnd | 读取当前位置的任何字符。该字符串的末尾并将其返回作为一个字符串 |
ReadToEndAsync | 读取当前位置的所有字符为字符串的结尾异步并将其返回作为一个字符串 |
示例如下:
static void Main(string[] args)
{
TextReader tr = new StringReader("你在他乡还好吗?\n很好!");
string line1 = tr.ReadLine(); //读取一行
Console.WriteLine(line1); //你在他乡好好吗?
string line2 = tr.ReadLine();
Console.WriteLine(line2); //很好!
//注意到此处时,指针已到,末尾,注释掉上面4行才能看到效果
//Peek()是读,但不用,不会影响指针
while (tr.Peek() > 0)
{
Console.WriteLine((char)tr.Read()); //逐个读取所有字符
} char[] charArr = new char[4];
tr.ReadBlock(charArr, 1, 3);
for (int i = 0; i < charArr.Count(); i++)
{
Console.WriteLine(charArr[i]);
} Console.ReadKey();
}
二、StreamReader的使用
StreamReader属性:
属性 | 说明 |
BaseStream | 返回基础流 |
CurrentEncoding | 获取当前 StreamReader 对象正在使用的当前字符编码 |
EndOfStream | 获取一个值,该值表示当前的流位置是否在流的末尾 |
StreamReader方法:
方法 | 说明 |
Close | 关闭 StreamReader 对象和基础流,并释放与读取器关联的所有系统资源 |
DiscardBufferedData | 清除内部缓冲区 |
Dispose | 释放由 TextReader 对象使用的所有资源 |
Peek | 返回下一个可用的字符,但不使用它 |
Read | 读取输入流中的下一个字符并使该字符的位置提升一个字符 |
ReadAsync | 异步从当前流中读取指定数目的字符并从指定索引开始将该数据写入缓冲区 |
ReadBlock | 从当前流中读取指定数目的字符并从指定索引开始将该数据写入缓冲区 |
ReadBlockAsync | 异步从当前流中读取指定数目的字符并从指定索引开始将该数据写入缓冲区 |
ReadLine | 从当前流中读取一行字符并将数据作为字符串返回 |
ReadLineAsync | 从当前流中异步读取一行字符并将数据作为字符串返回 |
ReadToEnd | 从流的当前位置到末尾读取所有字符 |
ReadToEndAsync | 异步读取从当前位置到流的结尾的所有字符并将它们作为一个字符串返回 |
示例:
static void Main(string[] args)
{
FileStream fs = new FileStream(@"D:\123.txt",FileMode.Open,FileAccess.Read);
TextReader tr = new StreamReader(fs,Encoding.Default);
string str = tr.ReadToEnd();
Console.WriteLine(str); Console.ReadKey();
}
三、StringWriter的作用
StringWirter主要用于对字符串进行读写。
常用属性:
属性 | 说明 |
Encoding | 获取将输出写入到其中的 Encoding |
FormatProvider | 获取控制格式设置的对象 |
NewLine | 获取或设置由当前 TextWriter 使用的行结束符字符串 |
常用方法:
方法 | 说明 |
Close | 关闭当前的 StringWriter 和基础流 |
Dispose | 释放StringWriter的资源 |
Flush | 清理当前编写器的所有缓冲区,使所有缓冲数据写入基础设备 |
GetStringBuilder | 返回基础 StringBuilder |
Write | 写入到 StringWriter 的此实例中 |
WriteLine | 写入重载参数指定的某些数据,后跟行结束符 |
示例:
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
sb.Append("你在他乡还好吗?");
using (TextWriter tw = new StringWriter(sb))
{
tw.WriteLine("难混啊!");
Console.WriteLine(sb.ToString()); //输出你在他乡还好吗?难混啊!(后面有个换行符,Write则没有)
} Console.ReadKey();
}
四、StreamWriter的作用
StreamWriter用于将一段内容写入到流里面,包括FileStream,MemoryStream等各种流。
属性:
属性 | 说明 |
AutoFlush | 获取或设置一个值,该值指示 StreamWriter 是否在每次调用 StreamWriter.Write 之后,将其缓冲区刷新到基础流 |
BaseStream | 获取同后备存储区连接的基础流 |
Encoding | 获取将输出写入到其中的 Encoding |
方法:
方法 | 说明 |
Close | 关闭当前的 StreamWriter 对象和基础流 |
Flush | 清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流 |
FlushAsync | 异步清除此流的所有缓冲区并导致所有缓冲数据都写入基础设备中 |
Write | 将字符写入流 |
WriteAsync | 将字符异步写入该流 |
WriteLine | 将字符写入该流,并加上结束符 |
WriteLineAsync | 将行结束符异步写入该流 |
示例:
static void Main(string[] args)
{
using (StreamWriter tw = new StreamWriter(@"D:\123.txt"))
{
tw.WriteLine("难混啊!");
Console.WriteLine(tw.BaseStream.GetType()); //输出FileStream
} Console.ReadKey();
}