我是Go語言新人,想在普通文件中進行讀取和寫入。
我可以得到inFile, _ := os.Open(INFILE, 0, 0)
,但實際上獲取文件內容是遇到了困難,因為read函數將[]byte
作為參數。
func (file *File) Read(b []byte) (n int, err Error)
Go語言常用讀寫方法匯總
這裏列出在Go中讀取和寫入文件的所有常見方法。
在以下示例中,我們通過讀取文件並寫入目標文件來複製文件。
從基礎開始
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)
}
}
}
在這裏,我使用了os.Open
和os.Create
,它們是os.OpenFile
的包裝器。我們通常不需要直接調用OpenFile
。
注意其中的EOF。 Read
嘗試在每次調用時填充buf
,如果到達文件末尾,則返回io.EOF
作為錯誤。在這種情況下,buf
仍將保存數據。隨後對Read
的調用將返回零作為讀取的字節數,並將相同的io.EOF
作為錯誤返回。任何其他錯誤都會導致一個panic錯誤。
使用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
在這裏隻是一個緩衝區,跟數據本身關係不大。在大多數其他情況下(特別是文本文件),bufio
非常有用,它可以讓我們輕鬆靈活地讀取和寫入a nice API,同時它可以在後台處理緩衝。
使用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)
}
}
非常簡單!但隻有當你確定你沒有處理大文件時才使用它。
參考資料