Чтение/запись MemoryStream и длина данных

У меня есть MemoryStream/BinaryWriter, я использую его следующим образом:

memStram = new MemoryStream();
memStramWriter = new BinaryWriter(memStram);

memStramWriter(byteArrayData);

теперь, чтобы прочитать, я делаю следующее:

byte[] data = new byte[this.BulkSize];
int readed = this.memStram.Read(data, 0, Math.Min(this.BulkSize,(int)memStram.Length));

Мой 2 вопрос:

  1. После того, как я прочитаю, позиция переместится в currentPosition+readed . Изменится ли memStram.Length?
  2. Я хочу инициализировать поток (как будто я только что его создал), могу ли я сделать следующее вместо этого, используя Dispose и новый снова, если нет, есть ли более быстрый способ, чем dispose&new: ;
memStram.Position = 0;
memStram.SetLength(0);

Спасибо. Джозеф


person Joseph    schedule 07.08.2013    source источник
comment
что там memStramWriter(byteArrayData); должно быть? потому что это не скомпилируется...   -  person Marc Gravell    schedule 07.08.2013
comment
так... ты имеешь в виду memStramWriter.Write(byteArrayData) ? И если да, то почему бы просто не memStram.Write(byteArrayData, 0, byteArrayData.Length) ?   -  person Marc Gravell    schedule 07.08.2013


Ответы (3)


  1. Нет; почему длина (т. е. размер данных) должна изменяться при чтении?
  2. Да; SetLength(0) работает быстрее: в этом случае никаких накладных расходов на выделение и перераспределение памяти.
person Dmitry Bychenko    schedule 07.08.2013

1: После того, как я прочитаю, позиция переместится в currentPosition+readed . Изменится ли memStram.Length?

Чтение обычно не меняет .Length — только .Position; но, строго говоря, не стоит даже смотреть на .Length и .Position при чтении (и часто: при записи), так как это поддерживается не во всех потоках. Обычно вы читаете до (одного из, в зависимости от сценария):

  • пока вы не прочитаете ожидаемое количество байтов, например, через некоторый заголовок длины, который сказал вам, сколько ожидать
  • пока вы не увидите сигнальное значение (обычное для текстовых протоколов, не очень частое для бинарных протоколов)
  • до конца потока (где Read возвращает неположительное значение)

Я бы также, вероятно, сказал: не используйте BinaryWriter. Кажется, нет ничего полезного, что он добавляет, просто используя Stream.

2: я хочу инициировать поток (например, я просто создаю его), могу ли я сделать следующее вместо этого, используя Dispose и новый снова, если нет, есть ли более быстрый способ, чем dispose&new:

Да, SetLength(0) подходит для MemoryStream. Это не обязательно хорошо во всех случаях (например, это не будет иметь особого смысла на NetworkStream).

person Marc Gravell    schedule 07.08.2013

Нет, длина не должна меняться, и вы можете легко проверить это с помощью переменной watch.

я бы использовал оператор using, так синтаксис будет более элегантным и понятным, и вы не забудете распорядиться им позже...

person L.Trabacchin    schedule 07.08.2013