2014-11-17 4 views
1

У меня есть метод сжатия байтового массива. Я использовал memystream и пробный тест для тестирования. результат из memystream больше, даже если его тот же метод, может кто-нибудь объяснить почему?C# MemoryStream больше, чем FileStream

public byte[] DeflateCompress(byte[] data2Compress) 
{ 
    using (FileStream _fileToCompress = File.Create("_deflatecompressed.bin")) 
    { 
     using (DeflateStream _compressionStream = new DeflateStream(_fileToCompress, CompressionMode.Compress)) 
     { 
      _compressionStream.Write(data2Compress, 0, data2Compress.Length); 
      _compressionStream.Close(); 
     } 
    } 

    return File.ReadAllBytes("_deflatecompressed.bin"); 
} 

public byte[] DeflateCompress(byte[] data2Compress) 
{ 
    using (MemoryStream _memStreamCompress = new MemoryStream()) 
    { 
     using (DeflateStream _defalteStreamCompress = new DeflateStream(_memStreamCompress, CompressionMode.Compress)) 
     { 
      _defalteStreamCompress.Write(data2Compress, 0, data2Compress.Length); 
      _defalteStreamCompress.Close(); 
     } 

     return _memStreamCompress.GetBuffer(); 
    } 
} 

Если я пишу выходной байтовый массив в файл, то один созданный с MemoryStream больше.

+0

использовать '.ToArray' вместо' .GetBuffer' [MSDN] (http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer (v = vs.110) .aspx) предупреждает об этом – Plutonix

ответ

6

MemoryStream.GetBuffer() вернет полный внутренний буфер, который может быть больше данных. При необходимости он изменяется в кусках. Когда вы превышаете емкость буфера, размер внутреннего буфера удваивается.

Если вам нужно преобразовать MemoryStream в массив байтов, содержащий только данные, используйте MemoryStream.ToArray(). Он создаст новый массив достаточного размера и скопирует в него соответствующее содержимое буфера.

Как MSDN выразился:

Обратите внимание, что буфер содержит выделенные байты, которые могут быть неиспользованными. Например, если строка "test" записана в объект MemoryStream, длина буфера, возвращаемого с GetBuffer, равна 256, а не 4, а 252 байт не используется. Чтобы получить только данные в буфере, используйте метод ToArray; однако ToArray создает копию данных в памяти.

GetBuffer функция полезна в том случае, когда вы хотите прочитать фрагмент из буфера, и вы не заботитесь, если размер точно не совпадают. ToArray работает медленнее, так как он должен копировать содержимое всего буфера для каждого вызова, а GetBuffer просто вернет ссылку на буфер.

Например, GetBuffer может быть полезно, если вы используете такие методы, как Stream.Write:

public abstract void Write(
    byte[] buffer, 
    int offset, 
    int count 
) 

Есть много мест в рамках с такими перегрузками, которые имеют буфер, но только процесс куска этого.

+0

спасибо за объяснение, проблема решена. –

+0

+1 Кроме того, вы можете использовать 'GetBuffer()' с 'Length', чтобы избежать дополнительной копии. –

1

MemoryStream использует байтовый массив внутри. Который при необходимости удваивается.

Скорее всего, у него есть TON неиспользуемых байтов.

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. –

+0

Снова в школу? Возникает вопрос: читайте заголовок: «C# MemoryStream больше, чем FileStream». Я объясняю, почему. Это ответ. – TomTom

+0

С такой репутацией вы должны знать лучше и предоставлять более качественные ответы ... –