scanner que lib golang example go bufferedreader peek

que - golang lib



Leyendo el número específico de bytes de un lector almacenado en golang (5)

Para hacer esto, solo necesita crear un segmento de bytes y read los datos en este segmento con

n := 512 buff := make([]byte, n) fs.Read(buff) // fs is your reader. Can be like this fs, _ := os.Open(''file'')

func (b *Reader) Read(p []byte) (n int, err error)

Lee datos de lectura en p. Devuelve el número de bytes leídos en p. Los bytes se toman a lo sumo de una lectura en el Reader subyacente, por lo tanto, n puede ser menor que len (p)

Soy consciente de la función específica en golang del paquete bufio .

func (b *Reader) Peek(n int) ([]byte, error)

Peek devuelve los siguientes n bytes sin adelantar al lector . Los bytes dejan de ser válidos en la siguiente llamada de lectura. Si Peek devuelve menos de n bytes, también devuelve un error que explica por qué la lectura es corta. El error es ErrBufferFull si n es mayor que el tamaño del búfer de b.

Necesito poder leer un número específico de bytes de un lector que hará avanzar al lector . Básicamente, idéntica a la función anterior, pero avanza el lector. ¿Alguien sabe cómo lograr esto?


Pase un búfer de tamaño n-bytes al lector.


Prefiero leer (), especialmente si va a leer cualquier tipo de archivos y podría ser útil para enviar datos en fragmentos, a continuación se muestra un ejemplo para mostrar cómo se usa

fs, err := os.Open("fileName"); if err != nil{ fmt.Println("error reading file") return } defer fs.Close() reader := bufio.NewReader(fs) buf := make([]byte, 1024) for{ v, _ := reader.Read(buf) //ReadString and ReadLine() also applicable or alternative if v == 0{ return } //in case it is a string file, you could check its content here... fmt.Print(string(buf)) }


Tenga en cuenta que el método bufio.Read invoca al io.Read subyacente como máximo una vez, lo que significa que puede devolver n < len(p) , sin alcanzar EOF. Si desea leer exactamente len(p) bytes o fallar con un error, puede usar io.ReadFull esta manera:

n, err := io.ReadFull(reader, p)

Esto funciona incluso si el lector está en búfer.