我是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)
}
}
非常简单!但只有当你确定你没有处理大文件时才使用它。
参考资料