新闻资讯

新闻资讯 媒体报道

如何使用Go语言读/写文件?

编辑:016     时间:2022-02-21

我是Go语言新人,想在普通文件中进行读取和写入。

我可以得到inFile, _ := os.Open(INFILE, 0, 0),但实际上获取文件内容是遇到了困难,因为read函数将[]byte作为参数。

func (file *File) Read(b []byte) (n int, err Error) 

 

Go语言读写文件

 

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)
    }
}

非常简单!但只有当你确定你没有处理大文件时才使用它。

go语言读写文件read/write

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐