2013-08-07 3 views
1

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

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 + прочитанным, будет ли изменен memStram.Length?
  2. Я хочу, чтобы создать поток (как я его только создаю), могу ли я сделать следующее, вместо этого использовать Dispose и new снова, если нет, есть более быстрый способ, чем удалять & new:;
memStram.Position = 0; 
memStram.SetLength(0); 

Спасибо. Joseph

+0

что такое 'memStramWriter (byteArrayData);' должен быть там? потому что это не будет компилироваться ... –

+0

Я пишу байты данных – Joseph

+0

так ... вы имеете в виду 'memStramWriter.Write (byteArrayData)'? И если да, почему бы не просто «memStram.Write (byteArrayData, 0, byteArrayData.Length)»? –

ответ

2

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

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

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

Я также хотел бы, вероятно, сказать: дон» t использовать BinaryWriter. Кажется, нет ничего полезного, что он добавляет только с помощью Stream.

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

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

2

Н.О. длина не должна измениться, и вы можете легко осмотреть, что с переменными часами

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

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