1

缓冲 a 有什么意义TextReader吗?

TextReader有自己的内部缓冲区,我可以在创建时设置大小,所以有什么理由我想使用我自己的缓冲区并调用Read( buffer, index, count )只使用 char 获取 charRead()吗?

4

2 回答 2

2

谁知道 Read() 方法的内部结构有多复杂?希望它们被优化为尽可能快和尽可能高效。但是调用单个 Read(...) 方法然后遍历字符数组可能会更快。但另一个重要问题是:在您的情况下,性能差异是什么重要吗?如果您只是每分钟读取 100 个字符一次或两次,那么性能可能并不重要。如果您正在按顺序处理数兆字节的文件,那么您可能需要尽可能好的性能。如果是后者,那么始终适用相同的答案:衡量,不要猜测。

于 2012-08-09T00:27:25.833 回答
1

这取决于你在做什么。如果您从流中读取未由 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/3ReadBlock/3完全取决于您的需求和上下文。例如,如果您正在编写解析器,您可能希望逐个字符地处理入站文本流,特别是因为TextReader通过它的Peek()方法免费为您提供一个前瞻字符。

于 2012-08-09T00:43:52.760 回答