Sería mejor si se utiliza memoryStream.getBuffer()
y compensaciones/longitud (uso memoryStream.Position
y memoryStream.Length
para la detección de límites) para acceder directamente byte[]
datos, Reader
/Writer
/BinaryFormatter
clases, u otras clases de aceptar Stream
, para la lectura/escritura primitiva/tipos complejos en memoria intermedia (eso es lo que se hace para MemoryStream
), que gestionan operaciones de copia sin inútiles, porque ya MemoryStream
se basa en la matriz de bytes.
he usado de esta manera con el envío asíncrono/recibir operaciones con conectores aceptar byte[]
, pero cuidado - si escribió algo en el tapón más allá de su actual Length
y quieren aumentar su longitud con SetLength()
para leer con la clase de lector - se obtiene muy incómodo comportamiento (en mi opinión): este método anula cada byte entre la longitud antigua y la nueva longitud si la longitud aumenta.
Resolvió este problema modificando el código fuente (una llamada Array.Clear en SetLength()
, y algunas adiciones para administrar sin clases internas de .NET) de MemoryStream
y usándolo en mi proyecto.
En cuanto a la reutilización de MemoryStream, estoy de acuerdo con la respuesta de Chris Taylor (SetLength(0)
)
Claro - Pero si la corriente ya contiene 100 bytes y escribo 99 bytes a continuación, cuando llegue a leer el contenido de esta corriente Leeré demasiado :) –
@CycleMachine - hay una razón por la que reiniciar/borrar flujos de memoria no está incorporada. Vea la respuesta vinculada que he agregado. – Oded
Si asigna un buffer grande, sería más eficiente reutilizar el buffer frente a la reasignación cada vez. En lugar de establecer la posición, puede usar SetLength (0) (ver mi respuesta a continuación) que mantendrá el búfer asignado y restablecerá los contadores internos, la longitud y la posición, lo que es más barato que la reasignación de un búfer grande con frecuencia. –