ReadLine для Binary Stream

При чтении данных из бинарного потока, например, из NetworkStream или FileStream, может потребоваться читать кусочки данных, а так же читать одну строку текста за раз. BinaryReader и Stream не поддерживают команды ReadLine. Вы можете использовать StreamReader, чтобы использовать ReadLine, но это не позволяет Вам читать кусочками. Read(byte[], int, int) не доступно в StreamReader.

Ниже предложено расширение для BinaryReader, позволяющие использовать ReadLine для бинарной строки. При необходимости оно позволяет читать кусочки данных так же, как текст — строками.

 

public class LineReader : BinaryReader
{
  private Encoding _encoding;
  private Decoder _decoder;   const int bufferSize = 1024;
  private char[] _LineBuffer = new char[bufferSize];
 public LineReader(Stream stream, int bufferSize, Encoding encoding)
    : base(stream, encoding)
  {
    this._encoding = encoding;
    this._decoder = encoding.GetDecoder();
  }
 public string ReadLine()
  {
    int pos = 0;   char[] buf = new char[2];   StringBuilder stringBuffer = null;
    bool lineEndFound = false;   while(base.Read(buf, 0, 2) > 0)
    {
      if (buf[1] == 'r')
      {
        // grab buf[0]
        this._LineBuffer[pos++] = buf[0];
        // get the 'n'
        char ch = base.ReadChar();
        Debug.Assert(ch == 'n');   lineEndFound = true;
      }
      else if (buf[0] == 'r')
      {
        lineEndFound = true;
      }
      else
      {
        this._LineBuffer[pos] = buf[0];
        this._LineBuffer[pos+1] = buf[1];
        pos += 2;   if (pos >= bufferSize)
        {
          stringBuffer = new StringBuilder(bufferSize + 80);
          stringBuffer.Append(this._LineBuffer, 0, bufferSize);
          pos = 0;
        }
      }

      if (lineEndFound)
      {
        if (stringBuffer == null)
        {
          if (pos > 0)
            return new string(this._LineBuffer, 0, pos);
          else
            return string.Empty;
        }
        else
        {
          if (pos > 0)
            stringBuffer.Append(this._LineBuffer, 0, pos);
          return stringBuffer.ToString();
        }
      }
    }   if (stringBuffer != null)
    {
      if (pos > 0)
        stringBuffer.Append(this._LineBuffer, 0, pos);
      return stringBuffer.ToString();
    }
    else
    {
      if (pos > 0)
        return new string(this._LineBuffer, 0, pos);
      else
        return null;
    }
  }
}

© Omar Zabib, Перевод 

Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.

Добавить комментарий