有没有办法知道StreamReader使用了流的多少个字节?
我有一个项目,我们需要读取一个文件,该文件的文本标题为二进制数据的开头。我最初尝试读取此文件的过程是这样的:
private int _dataOffset;
void ReadHeader(string path)
{
using (FileStream stream = File.OpenRead(path))
{
StreamReader textReader = new StreamReader(stream);
do
{
string line = textReader.ReadLine();
handleHeaderLine(line);
} while(line != "DATA") // Yes, they used "DATA" to mark the end of the header
_dataOffset = stream.Position;
}
}
private byte[] ReadDataFrame(string path, int frameNum)
{
using (FileStream stream = File.OpenRead(path))
{
stream.Seek(_dataOffset + frameNum * cbFrame, SeekOrigin.Begin);
byte[] data = new byte[cbFrame];
stream.Read(data, 0, cbFrame);
return data;
}
return null;
}
问题是,当我将
_dataOffset
设置为stream.Position
时,我得到了StreamReader读取到的位置,而不是 header 的末尾。我一想到它就很有意义,但是我仍然需要能够知道标题的末尾在哪里,而且我不确定是否有办法做到这一点,并且仍然可以利用StreamReader。 最佳答案
您可以通过多种方式找出StreamReader
实际上返回了多少字节(而不是从流中读取),恐怕它们都不是那么简单。
textReader.CurrentEncoding.GetByteCount(totalLengthOfAllTextRead)
的结果,然后搜索流中的该位置。 StreamReader
对象的私有(private)变量的值,该值对应于内部缓冲区中的当前字节位置(与流中的字节位置不同-通常在后面,但不超过其值)。通过.NET Reflector判断,此变量似乎被命名为bytePos
。 StreamReader
,而是实现在Stream
或BinaryReader
之上构建的自定义ReadLine函数(保证BinaryReader
绝对不会超出您的要求)。此自定义函数必须逐个char从流中读取,因此实际上您必须使用低级Decoder
对象(除非编码为ASCII/ANSI,在这种情况下,由于单字节编码,操作会更简单) 。 选项1将是我想象中效率最低的(因为您正在有效地重新编码刚解码的文本),选项3是最难实现的,尽管也许是最优雅的。我可能会建议您不要使用丑陋的反射技巧(选项2),尽管它看起来很诱人,它是最直接的解决方案,并且只用了几行。 (说实话,
StreamReader
类确实应该通过公共(public)属性公开此变量,但是可惜没有。)因此,最终由您决定,但是方法1或3应该能很好地完成此工作。 ..希望能有所帮助。
关于c# - StreamReader消耗的字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/737408/