2012-08-06 15 views
6

Cómo saltar más eficiente un número de bytes en cualquier Stream?Cómo saltar bytes en una corriente

Si es posible, me gustaría llegar o lanzará una EndOfStreamException al tratar de saltar más allá del final de la secuencia.


estoy escribiendo una corriente de encargo Reader para ISO 9660 tipos de datos primitivos, y esto puede implicar una gran cantidad de saltar en corrientes seekable y no seekable, ambos números pequeños (4) y un gran número (2048) de bytes. Por lo tanto, quiero implementar un método Skip(int count) que es un poco más eficiente que leer y descartar los bytes omitidos.

Por ejemplo, en una corriente seekable que puede ser que stream.Position += 4, pero esto no produce una EndOfStreamException la hora de buscar más allá del final de la corriente, y que no sé cómo probar que sin necesidad de leer algo. Para los flujos no seekable, el establecimiento de Position no es ni siquiera una opción, pero la lectura y, posteriormente, descartando un gran número de bytes y la asignación de matrices de bytes no utilizados parece muy derrochador.

+0

Francamente, creo que lo que usted ha descrito (comprobando 'CanSeek' y, o bien el uso de' Seek' o leer + descartes) es más o menos "ella". Tal vez podrías arriesgarte a leer '.Length' en el escenario' CanSeek', pero: también debes manejarlo con una excepción; No estoy seguro de que 'CanSeek' * garantice * una implementación' Length'. –

Respuesta

8

En lugar de stream.Position += 4 puede usar stream.Seek(4, SeekOrigin.Current); que le ahorra una llamada a la API de Win32.

Siempre puede comprobar contra la propiedad Length de la corriente si está soportada. Si no es compatible, no hay otra manera que tratar de leer desde la transmisión. En realidad, en las secuencias donde la longitud es desconocida, la búsqueda es esencialmente lectura.

Si CanSeek es falso, no puede leer Length y viceversa.

Sobre perdido la memoria durante la lectura, usted no tiene que leer cantidad de bytes que está saltando. Puede asignar un tamaño de memoria fijo (grande o pequeño) y usarlo para cualquier longitud que desee. Si necesita omitir más de ese tamaño, simplemente lea bloques y lea el resto x % size bytes.

+0

¿Estás seguro de que todas las transmisiones buscables tienen una "Longitud"? E incluso si la búsqueda directa está leyendo, ¿sabe usted de ninguna manera para evitar la asignación de matrices de bytes para transmisiones no buscables? – Virtlink

+0

@Virtlink: prácticamente. Citando MSDN: "Si una clase derivada de Stream no admite la búsqueda, las llamadas a Length, SetLength, Position y Seek lanzan una excepción NotSupportedException". –

+0

@Virtlink: También agregué una edición a mi respuesta sobre el problema de asignación de memoria. Hay otras técnicas de bajo nivel también, házmelo saber si te interesa "tanto" guardar la memoria. –

Cuestiones relacionadas