是否需要缓冲TextReader?

时间:2012-08-09 00:12:33

标签: c# .net io

缓存TextReader是否有意义?

TextReader有自己的内部缓冲区,我可以在创建时设置大小,所以我有理由想要使用自己的缓冲区并调用Read( buffer, index, count )而不是通过char使用{获取char {1}}?

2 个答案:

答案 0 :(得分:2)

谁知道Read()方法的内部有多复杂?希望它们能够尽可能快速有效地进行优化。但是,调用单个Read(...)方法然后迭代字符数组可能会更快。但另一个重要问题是:在您的情况下,性能差异是什么?如果你每分钟只读一次或两次100个字符,那么性能可能并不重要。如果您按顺序处理多兆字节文件,那么您可能希望获得最佳性能。如果是后者,那么同样的答案总是适用:测量,不要猜测。

答案 1 :(得分: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()方法为您提供了一个前瞻性字符。免费。