При чтении данных из бинарного потока, например, из 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 или нажмите здесь чтобы информировать меня. Спасибо.