缓冲 a 有什么意义TextReader
吗?
TextReader
有自己的内部缓冲区,我可以在创建时设置大小,所以有什么理由我想使用我自己的缓冲区并调用Read( buffer, index, count )
只使用 char 获取 charRead()
吗?
谁知道 Read() 方法的内部结构有多复杂?希望它们被优化为尽可能快和尽可能高效。但是调用单个 Read(...) 方法然后遍历字符数组可能会更快。但另一个重要问题是:在您的情况下,性能差异是什么重要吗?如果您只是每分钟读取 100 个字符一次或两次,那么性能可能并不重要。如果您正在按顺序处理数兆字节的文件,那么您可能需要尽可能好的性能。如果是后者,那么始终适用相同的答案:衡量,不要猜测。
这取决于你在做什么。如果您从流中读取未由 CR+LF 对分隔的固定长度记录,您将需要执行以下操作
public static void Process()
{
using ( Stream s = OpenCommunicationsStream() )
using ( TextReader tr = new StreamReader(s) )
{
char[] record = char[80] ;
int chars_read ;
while ( (chars_read=tr.Read(record,0,record.Length)) == record.Length )
{
DoSomethingWithRecord( record ) ;
}
if ( chars_read > 0 ) throw new InvalidDataException("wrong length record") ;
}
return ;
}
为什么您可能使用Read/0
而不是Read/3
或ReadBlock/3
完全取决于您的需求和上下文。例如,如果您正在编写解析器,您可能希望逐个字符地处理入站文本流,特别是因为TextReader
通过它的Peek()
方法免费为您提供一个前瞻字符。