Go'daki dosyaları okumak ve yazmak için tüm yolların Go 1 uyumlu bir listesini yapalım.
Dosya API'si son zamanlarda değiştiğinden ve diğer yanıtların çoğu Go 1 ile çalışmadığından, bufio
IMHO'nun da önemli olduğunu kaçırıyorlar .
Aşağıdaki örneklerde, dosyayı okuyarak ve hedef dosyaya yazarak kopyalarım.
Temel bilgilerle başlayın
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)
}
}
}
Burada kullanılan os.Open
ve os.Create
etrafında uygun sarmalayıcılar olan os.OpenFile
. Genellikle OpenFile
doğrudan aramamız gerekmez .
EOF tedavisine dikkat edin. her çağrıyı Read
doldurmaya çalışır buf
ve io.EOF
dosya sonuna ulaşırsa hata olarak döner . Bu durumda buf
yine de veri tutulacaktır. Sonuç çağrıları, Read
okunan bayt sayısı olarak sıfır ve io.EOF
hata ile aynı olarak sıfır döndürür . Başka herhangi bir hata paniğe yol açacaktır.
kullanma 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
burada sadece tampon görevi görüyor, çünkü verilerle ilgimiz yok. Diğer çoğu durumda (özellikle metin dosyalarıyla)bufio
, kolay ve esnek bir şekilde okuma ve yazma için güzel bir API vererek çok yararlıdır , sahne arkasındaki arabelleğe almayı işler.
kullanma ioutil
package main
import (
"io/ioutil"
)
func main() {
// read the whole file at once
b, err := ioutil.ReadFile("input.txt")
if err != nil {
panic(err)
}
// write the whole body at once
err = ioutil.WriteFile("output.txt", b, 0644)
if err != nil {
panic(err)
}
}
Pasta kadar kolay! Ancak, yalnızca büyük dosyalarla uğraşmadığınızdan eminseniz kullanın.