Go语言bufio.NewWriter写入文件

Go语言bufio.NewWriter写入文件教程

Golang 中,写 文件 有四种方法,分别为:使用 io.WriteString 写文件,使用 ioutil.WriteFile 写文件,使用 file.Write 写文件,使用 writer.WriteString 写文件。

bufio.Write写文件

语法

func (b *Writer) Write(p []byte) (n int, err error)

参数

参数 描述
b 文件对象。
p 要写入的文件内容。

返回值

返回值 描述
n 成功写入的字节数。
err 写入失败,则返回错误信息。

说明

使用 bufio.Write 方法写文件,接受的 参数 是一个要写入的文件内容的 字节 数组。如果写入成功,返回成功写入的字节数,如果写入失败,返回 error 信息。

使用此方法在写入文件之前,我们需要判断文件是否存在,如果文件不存在,则需要创建文件。

bufio.WriteString写文件

语法

func (b *Writer) WriteString(s string) (int, error)

参数

参数 描述
b 文件对象。
s 要写入的文件内容。

返回值

返回值 描述
int 成功写入的字节数。
error 写入失败,则返回错误信息。

说明

使用 bufio.WriteString 方法写文件,接受的参数是一个要写入的文件内容的 字符串。如果写入成功,返回成功写入的字节数,如果写入失败,返回 error 信息。

使用此方法在写入文件之前,我们需要判断文件是否存在,如果文件不存在,则需要创建文件。

案例

bufio.Write写文件

使用 bufio.Write 写文件

package main import ( "bufio" "fmt" "io/ioutil" "os" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") var( fileName = "C:/haicoder.txt" content = "Hello HaiCoder" file *os.File err error ) //使用追加模式打开文件 file, err = os.OpenFile(fileName, os.O_APPEND, 0666) if err != nil{ fmt.Println("Open file err =", err) return } defer file.Close() writer := bufio.NewWriter(file) //写入文件 n, err := writer.Write([]byte(content)) if err != nil{ fmt.Println("Write file err =", err) return } fmt.Println("Write file success, n =", n) writer.Flush() //读取文件 fileContent, err := ioutil.ReadFile(fileName) if err != nil{ fmt.Println("Read file err =", err) return } fmt.Println("Read file success =", string(fileContent)) }

程序运行后,控制台输出如下:

19_golang writer写入文件.png

在运行程序之前,文件 “C:/haicoder.txt” 是存在的,因此,我们直接使用 os.OpenFile 打开文件,并且使用的是追加的模式。

接着,我们使用 bufio.NewWriter 传入打开的文件句柄做为参数,创建一个 Writer 实例,接着,直接调用 writer.Write 来写入文件,写入文件成功后,我们使用 writer.Flush 来刷新文件内容。

因为,使用 writer.Write 写入文件是带缓冲区的,因此,一定在关闭文件之前使用 writer.Flush 来刷新文件内容。最后,使用 ioutil.ReadFile 一次性读出了整个文件内容,我们发现读出来的文件内容与写入的文件内容一样。

现在,我们再次运行程序,控制台输出如下:

20_golang writer写入文件.png

我们看到,此时文件的内容已经有了两个 “Hello HaiCoder”,说明原来文件的内容没有被清空,而是被追加写入了。现在,我们删除 “C:/haicoder.txt” 文件 ,再次运行程序,控制台输出如下:

21_golang writer写入文件.png

此时程序报错,因此,我们在写入文件之前需要判断文件是否存在,我们将程序修改如下:

package main import ( "bufio" "fmt" "io/ioutil" "os" ) // 判断所给路径文件/文件夹是否存在 func Exists(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true } func main() { fmt.Println("嗨客网(www.haicoder.net)") var( fileName = "C:/haicoder.txt" content = "Hello HaiCoder" file *os.File err error ) if Exists(fileName){ //使用追加模式打开文件 file, err = os.OpenFile(fileName, os.O_APPEND, 0666) if err != nil{ fmt.Println("Open file err =", err) return } }else{ file, err = os.Create(fileName) //创建文件 if err != nil { fmt.Println("file create fail") return } } defer file.Close() writer := bufio.NewWriter(file) //写入文件 n, err := writer.Write([]byte(content)) if err != nil{ fmt.Println("Write file err =", err) return } fmt.Println("Write file success, n =", n) writer.Flush() //读取文件 fileContent, err := ioutil.ReadFile(fileName) if err != nil{ fmt.Println("Read file err =", err) return } fmt.Println("Read file success =", string(fileContent)) }

程序运行后,控制台输出如下:

22_golang writer写入文件.png

我们自定义了一个 Exists 函数,Exists 函数的功能是使用 os.Stat 判断文件是否存在,如果存在,则返回 true,否则返回 false。

接着,在写入文件之前,我们首先使用 Exists 函数判断文件是否存在,如果文件存在,如直接打开,如果文件不存在,则我们使用 Create 创建文件,之后再写入文件。

writer.WriteString写文件

使用 writer.WriteString 写文件

package main import ( "bufio" "fmt" "io/ioutil" "os" ) // 判断所给路径文件/文件夹是否存在 func Exists(path string) bool { _, err := os.Stat(path) //os.Stat获取文件信息 if err != nil { if os.IsExist(err) { return true } return false } return true } func main() { fmt.Println("嗨客网(www.haicoder.net)") var( fileName = "C:/haicoder.txt" content = "Hello HaiCoder" file *os.File err error ) if Exists(fileName){ //使用追加模式打开文件 file, err = os.OpenFile(fileName, os.O_APPEND, 0666) if err != nil{ fmt.Println("Open file err =", err) return } }else{ file, err = os.Create(fileName) //创建文件 if err != nil { fmt.Println("file create fail") return } } defer file.Close() writer := bufio.NewWriter(file) //写入文件 n, err := writer.WriteString(content) if err != nil{ fmt.Println("Write file err =", err) return } fmt.Println("Write file success, n =", n) writer.Flush() //读取文件 fileContent, err := ioutil.ReadFile(fileName) if err != nil{ fmt.Println("Read file err =", err) return } fmt.Println("Read file success =", string(fileContent)) }

程序运行后,控制台输出如下:

23_golang writer写入文件.png

使用 writer.WriteString 写文件方法与使用 writer.Write 写文件类似,只不过 writer.WriteString 可以直接写一个字符串。

Go语言bufio.Write写文件总结

func (b *Writer) Write(p []byte) (nn int, err error)

使用 bufio.Write 方法写文件,接受的参数是一个要写入的文件内容的字节数组。如果写入成功,返回成功写入的字节数,如果写入失败,返回 error 信息。

使用此方法在写入文件之前,我们需要判断文件是否存在,如果文件不存在,则需要创建文件。Go 语言 bufio.WriteString写文件语法:

func (b *Writer) WriteString(s string) (int, error)

使用 bufio.WriteString 方法写文件,接受的参数是一个要写入的文件内容的字符串。如果写入成功,返回成功写入的字节数,如果写入失败,返回 error 信息。

使用此方法在写入文件之前,我们需要判断文件是否存在,如果文件不存在,则需要创建文件。