Mari kita membuat daftar Go-kompatibel semua cara untuk membaca dan menulis file di Go.
Karena file API telah berubah baru-baru ini dan sebagian besar jawaban lainnya tidak berfungsi dengan Go 1. Mereka juga ketinggalan bufio
IMHO yang penting.
Dalam contoh berikut ini saya menyalin file dengan membaca darinya dan menulis ke file tujuan.
Mulailah dengan dasar-dasarnya
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)
}
}
}
Di sini saya menggunakan os.Open
dan os.Create
pembungkus yang nyaman di sekitar os.OpenFile
. Kami biasanya tidak perlu menelepon OpenFile
langsung.
Perhatikan merawat EOF. Read
mencoba untuk mengisi buf
setiap panggilan, dan kembali io.EOF
sebagai kesalahan jika mencapai akhir file dalam melakukannya. Dalam hal ini buf
masih akan menyimpan data. Panggilan konsekuen untuk Read
mengembalikan nol ketika jumlah byte dibaca dan sama io.EOF
dengan kesalahan. Kesalahan lainnya akan menyebabkan kepanikan.
Menggunakan 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
hanya bertindak sebagai penyangga di sini, karena kami tidak memiliki banyak hubungannya dengan data. Dalam kebanyakan situasi lain (khususnya dengan file teks) bufio
sangat berguna dengan memberi kami API yang bagus untuk membaca dan menulis dengan mudah dan fleksibel, sementara itu menangani buffering di belakang layar.
Menggunakan 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)
}
}
Mudah seperti pai! Tetapi gunakan hanya jika Anda yakin tidak berurusan dengan file besar.