c# – StreamReader消耗的字节数

前端之家收集整理的这篇文章主要介绍了c# – StreamReader消耗的字节数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法知道StreamReader使用了多少字节的流?

我有一个项目,我们需要读取一个文件,其中包含文本标题,后跟二进制数据的开头.我最初尝试读取此文件是这样的:

  1. private int _dataOffset;
  2. void ReadHeader(string path)
  3. {
  4. using (FileStream stream = File.OpenRead(path))
  5. {
  6. StreamReader textReader = new StreamReader(stream);
  7.  
  8. do
  9. {
  10. string line = textReader.ReadLine();
  11. handleHeaderLine(line);
  12. } while(line != "DATA") // Yes,they used "DATA" to mark the end of the header
  13.  
  14. _dataOffset = stream.Position;
  15. }
  16. }
  17.  
  18. private byte[] ReadDataFrame(string path,int frameNum)
  19. {
  20. using (FileStream stream = File.OpenRead(path))
  21. {
  22. stream.Seek(_dataOffset + frameNum * cbFrame,SeekOrigin.Begin);
  23.  
  24. byte[] data = new byte[cbFrame];
  25. stream.Read(data,cbFrame);
  26.  
  27. return data;
  28. }
  29. return null;
  30. }

问题是,当我将_dataOffset设置为stream.Position时,我得到StreamReader已读取的位置,而不是标头的末尾.一旦我想到它这是有道理的,但我仍然需要能够知道标题的结尾在哪里,我不确定是否有办法做到这一点并仍然利用StreamReader.

解决方法

您可以通过多种方式找出StreamReader实际返回的字节数(而不是从流中读取),这些都不是太直接我害怕.

>获取textReader.CurrentEncoding.GetByteCount(totalLengthOfAllTextRead)的结果,然后在流中寻找此位置.
>使用一些反射hackery来检索StreamReader对象的私有变量的值,该变量对应于内部缓冲区中的当前字节位置(与流不同 – 通常在后面,但当然不超过等于).通过.NET Reflector判断,这个变量似乎被命名为bytePos.
>根本不需要使用StreamReader,而是实现构建在Stream或BinaryReader之上的自定义ReadLine函数(保证BinaryReader永远不会比你要求的更早阅读).这个自定义函数必须通过char读取流char,所以你实际上必须使用低级Decoder对象(除非编码是ASCII / ANSI,在这种情况下,由于单字节编码,事情有点简单) .

选项1将是我想象中效率最低的(因为你有效地重新编码刚解码的文本),而选项3最难实现,尽管可能是最优雅的.我可能建议不要使用丑陋的反射黑客(选项2),即使它看起来很诱人,是最直接的解决方案,只需要几行. (说实话,StreamReader类实际上应该通过公共属性公开这个变量,但是它没有.)所以最后,它取决于你,但是方法1或3应该能够很好地完成工作. ..

希望有所帮助.

猜你在找的C#相关文章