Nous allons faire un Aller de 1 compatible liste de toutes les manières de lire et d'écrire des fichiers en Aller.
Car le fichier API a changé récemment et la plupart des autres réponses ne fonctionnent pas avec Go 1. Ils ont également manquer bufio
ce qui est important à mon humble avis.
Dans les exemples qui suivent, je copie un fichier en lecture et en écriture dans le fichier de destination.
Commencer avec les bases
package main
import (
"io"
"os"
)
func main() {
// open input file
fi, err := os.Open("input.txt")
if err != nil { panic(err) }
// close fi on exit and check for its returned error
defer func() {
if err := fi.Close(); err != nil {
panic(err)
}
}()
// open output file
fo, err := os.Create("output.txt")
if err != nil { panic(err) }
// close fo on exit and check for its returned error
defer func() {
if err := fo.Close(); err != nil {
panic(err)
}
}()
// make a buffer to keep chunks that are read
buf := make([]byte, 1024)
for {
// read a chunk
n, err := fi.Read(buf)
if err != nil && err != io.EOF { panic(err) }
if n == 0 { break }
// write a chunk
if _, err := fo.Write(buf[:n]); err != nil {
panic(err)
}
}
}
Ici, j'ai utilisé os.Open
et os.Create
qui sont commodes wrappers autour os.OpenFile
. Habituellement, nous n'avez pas besoin d'appeler OpenFile
directement.
Avis de traitement des expressions du FOLKLORE. Read
tente de remplir buf
sur chaque appel, et les retours io.EOF
d'erreur si il arrive à la fin du fichier. Dans ce cas - buf
conservent des données. Conséquente des appels d' Read
renvoie zéro à mesure que le nombre d'octets lus et même io.EOF
d'erreur. Toute autre erreur conduira à une panique.
À l'aide de bufio
package main
import (
"bufio"
"io"
"os"
)
func main() {
// open input file
fi, err := os.Open("input.txt")
if err != nil { panic(err) }
// close fi on exit and check for its returned error
defer func() {
if err := fi.Close(); err != nil {
panic(err)
}
}()
// make a read buffer
r := bufio.NewReader(fi)
// open output file
fo, err := os.Create("output.txt")
if err != nil { panic(err) }
// close fo on exit and check for its returned error
defer func() {
if err := fo.Close(); err != nil {
panic(err)
}
}()
// make a write buffer
w := bufio.NewWriter(fo)
// make a buffer to keep chunks that are read
buf := make([]byte, 1024)
for {
// read a chunk
n, err := r.Read(buf)
if err != nil && err != io.EOF { panic(err) }
if n == 0 { break }
// write a chunk
if _, err := w.Write(buf[:n]); err != nil {
panic(err)
}
}
if err = w.Flush(); err != nil { panic(err) }
}
bufio
est tout simplement agir comme un tampon ici, parce que nous n'avons pas beaucoup à faire avec les données. Dans la plupart des autres situations (spécialement avec des fichiers de texte) bufio
est très utile en nous donnant une bonne API pour la lecture et l'écriture de manière simple et flexible, alors qu'il gère de mise en mémoire tampon derrière les coulisses.
À l'aide de ioutil
package main
import (
"io/ioutil"
)
func main() {
// read whole the file
b, err := ioutil.ReadFile("input.txt")
if err != nil { panic(err) }
// write whole the body
err = ioutil.WriteFile("output.txt", b, 0644)
if err != nil { panic(err) }
}
Facile comme bonjour! Mais ne l'utilisez que si vous êtes sûr que vous n'êtes pas affaire avec de gros fichiers.