c# - 如何判断XmlTextReader已经读取了多少数据?

标签 c# .net networkstream xmltextreader

当我处理 XML 时,如何确定已经处理了多少数据(无论是字节还是字符)?如果底层流是一个 FileStream,那就很容易了。我如何使用底层的 NetworkStream 来做到这一点?

性能和内存考虑非常重要。

NetworkStream reportStream = GetStream();
using (var bufferStream = new BufferedStream(reportStream))
{
  using (var xmlTextReader = new XmlTextReader(bufferStream))
  {
    while (xmlTextReader.Read())
    {
      // TODO check how much data have been read already
      // bufferStream.Position and bufferStream.Length don't work 
      // because NetworkStream doesn't support them by design

      // process XML data
    }
  }
}

最佳答案

根据 @AlexeiLevenkov 的建议,我为我的用例实现了一个简单的流包装器。

public class CountingStream : Stream
{
    private Stream _stream;
    private long _totalBytesRead;
    private long _totalBytesWritten;

    public CountingStream(Stream stream)
    {
        _stream = stream;
        _totalBytesRead = 0;
        _totalBytesWritten = 0;
    }

    public long TotalBytesRead { get { return _totalBytesRead; } }
    public long TotalBytesWritten { get { return _totalBytesWritten; } }

    public override void Flush()
    {
        _stream.Flush();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return _stream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        _stream.SetLength(value);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        int bytesRead = _stream.Read(buffer, offset, count);
        _totalBytesRead += bytesRead;
        return bytesRead;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        _totalBytesWritten += count;
        _stream.Write(buffer, offset, count);
    }

    public override bool CanRead
    {
        get { return _stream.CanRead; }
    }

    public override bool CanSeek
    {
        get { return _stream.CanSeek; }
    }

    public override bool CanWrite
    {
        get { return _stream.CanWrite; }
    }

    public override long Length
    {
        get { return _stream.Length; }
    }

    public override long Position
    {
        get { return _stream.Position; }
        set { _stream.Position = value; }
    }

    protected override void Dispose(bool disposing)
    {
        try
        {
            if (!disposing)
                return;
            if (_stream == null)
                return;

            try
            {
                Flush();
            }
            finally
            {
                _stream.Close();
            }
        }
        finally
        {
            _stream = null;
            base.Dispose(disposing);
        }
    }
}

关于c# - 如何判断XmlTextReader已经读取了多少数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660414/

相关文章:

c# - 如何使用 Win2D(行距)计算 FontFamily 的高度?

c# - 如何评估 System.Linq.Expressions.Expression

.net - AudioGraph(UWP)中的卷积器节点

c# - 通过 NetworkStream(套接字)写入/读取字符串以进行聊天

c# - 如何检索 IPv6 子网掩码长度

c# - JSON解析C#无名称变量

用于在线分发的 .net Bootstrap

c# - 通过 LAN C# 流式传输视频

C# TcpClient发送数据后关闭XNA游戏窗口

c# - 使用 c# using 语句延迟实例化