Leer y escribir archivos son tareas básicas necesarias para muchos programas en Go. Primero, veremos
algunos ejemplos
de lectura de archivos.
|
|
|
package main
|
|
import (
"bufio"
"fmt"
"io"
"os"
)
|
Leer archivos requiere verificar la mayoría de las llamadas en busca de errores. Este ayudante simplificará
nuestras
comprobaciones de errores a continuación.
|
func check(e error) {
if e != nil {
panic(e)
}
}
|
|
func main() {
|
Tal vez la tarea más básica de lectura de archivos sea absorber todo el contenido de un archivo en la
memoria.
|
dat, err := os.ReadFile("/tmp/dat")
check(err)
fmt.Print(string(dat))
|
A menudo querrás más control sobre cómo y qué partes de un archivo se leen. Para estas tareas, comienza por
Open (abrir) un archivo para obtener un valor de os.File .
|
f, err := os.Open("/tmp/dat")
check(err)
|
Lee algunos bytes desde el principio del archivo. Permite que se lean hasta 5, pero también ten en cuenta
cuántos se
leyeron realmente.
|
b1 := make([]byte, 5)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1[:n1]))
|
También puedes Seek (buscar) una ubicación conocida en el archivo y Read (leer)
desde allí.
|
o2, err := f.Seek(6, 0)
check(err)
b2 := make([]byte, 2)
n2, err := f.Read(b2)
check(err)
fmt.Printf("%d bytes @ %d: ", n2, o2)
fmt.Printf("%v\n", string(b2[:n2]))
|
El paquete io proporciona algunas funciones que pueden ser útiles para la lectura de archivos.
Por
ejemplo, lecturas como las anteriores pueden implementarse de manera más robusta con
ReadAtLeast .
|
o3, err := f.Seek(6, 0)
check(err)
b3 := make([]byte, 2)
n3, err := io.ReadAtLeast(f, b3, 2)
check(err)
fmt.Printf("%d bytes @ %d: %s\n", n3, o3, string(b3))
|
No hay una función incorporada para rebobinar, pero Seek(0, 0) logra esto.
|
_, err = f.Seek(0, 0)
check(err)
|
El paquete bufio implementa un lector con buffer que puede ser útil tanto por su eficiencia
con muchas
lecturas pequeñas como por los métodos adicionales de lectura que proporciona.
|
r4 := bufio.NewReader(f)
b4, err := r4.Peek(5)
check(err)
fmt.Printf("5 bytes: %s\n", string(b4))
|
Cierra el archivo cuando hayas terminado (normalmente esto se programaría inmediatamente después de
Open
(abrir) con defer ).
|
f.Close()
}
|