C# - 为什么 StreamReader ReadLine 在调用 ReadLine 之前读取数据?

C# - Why StreamReader ReadLine reading data before calling ReadLine?

我在 NetworkStream 上使用 StreamReader,我只想读取一行或多行,另一个数据是 byte array(如文件数据),我不想读取该文件StreamReader 中的数据,例如我需要逐行读取文本 header,当我看到一个空行时,header 读取必须结束,接下来我必须读取文件字节, 当我用 StreamReader 测试这个时,我遇到了问题,因为 StreamReader 在我调用 ReadLine 之前(在第一个 ReadLine 之后)和在处理 StreamReader 并使用 NetworkStream 读取字节我在 header 之后得到的字节块不是文件字节数组的开始,因为 StreamReader 读取了 ReadLine 中的字节块并且没有调用 ReadLine .

StreamReader 或我的代码设置有什么问题?

using (var reader = new StreamReader(tcpClient.GetStream()))
{
    while (true)
    {
        var line = reader.ReadLine();
        headerResponse += line + "\r\n";
        if (line == "")
            break;
    }
    using (var fileStreamReader = tcpClient.GetStream())
    {
        byte[] bytes = new byte[1024];
        var readCount = fileStreamReader.Read(bytes, 0, bytes.Length);
    }
}

我创建了一个 CustomStreamReader 并在 ReadLine 方法中一个一个地读取字节并解决了我的问题:

public class CustomStreamReader : Stream
{
    NetworkStream CurrentStream { get; set; }

    public CustomStreamReader(NetworkStream currentStream)
    {
        CurrentStream = currentStream;
    }

    public override bool CanRead => CurrentStream.CanRead;

    public override bool CanSeek => CurrentStream.CanSeek;

    public override bool CanWrite => CurrentStream.CanWrite;

    public override long Length => CurrentStream.Length;

    public override long Position { get => CurrentStream.Position; set => CurrentStream.Position = value; }

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

    public override int Read(byte[] buffer, int offset, int count)
    {
        return CurrentStream.Read(buffer, offset, count);
    }

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

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

    public override void Write(byte[] buffer, int offset, int count)
    {
        CurrentStream.Write(buffer, offset, count);
    }

    public string ReadLine()
    {
        List<byte> result = new List<byte>();
        do
        {
            int data = CurrentStream.ReadByte();
            if (data == -1)
                break;
            result.Add((byte)data);
            if (data == 13)
            {
                data = CurrentStream.ReadByte();
                if (data == -1)
                    break;
                result.Add((byte)data);
                if (data == 10)
                    break;
            }
        }
        while (true);
        return Encoding.UTF8.GetString(result.ToArray());
    }
}