上一篇章我们已经学会了如何创建文件,本篇章来看看如何写入数据。
回顾一下我们上一篇中创建文件的代码,如下:
package main
import (
"fmt"
"os"
)
func CreateFile(path string) {
//创建文件,返回两个值,一是创建的文件,二是错误信息
file, err := os.Create(path)
if err != nil { // 如果有错误,打印错误,同时返回
fmt.Println("err = ", err)
return
}
defer file.Close() // 在退出整个函数时,关闭文件
}
func main() {
var filePath = "a.txt"
CreateFile(filePath)
}
执行完毕之后,创建了一个 a.txt 文件如下:
image-20210606112559324
file.WriteString("Hello World")
文件打开以后,可以向文件中写数据,可以使用WriteString( )方法。
func CreateFile(path string) {
//创建文件,返回两个值,一是创建的文件,二是错误信息
file, err := os.Create(path)
if err != nil { // 如果有错误,打印错误,同时返回
fmt.Println("err = ", err)
return
}
// 写入数据到文件中
for i := 1; i < 10; i++ {
file.WriteString("Hello World")
}
defer file.Close() // 在退出整个函数时,关闭文件
}
func main() {
var filePath = "a.txt"
CreateFile(filePath)
}
执行如下:
image-20210606115225014
WriteString( )方法默认返回两个参数,第一个参数返回写入数据长度,第二个参数返回错误信息。
我们修改上面的代码如下:
image-20210606120403713
n, err := file.WriteString("Hello World")
fmt.Println("写入数据的长度:", n)
// 打印写入数据的错误信息
if err != nil {
fmt.Println("写入数据的错误信息:", err)
}
// 第一个参数 n,指的是写入文件的数据长度,第二个参数 err 记录的是错误信息。
WriteString( )方法默认写到文件中的数据是不换行的。如果想换行,可以采用如下的方式
str = fmt.Sprintf("i = %d\n", i) // 对字符串进行格式化,设置换行\n
n, err := file.WriteString(str)
// 首先在数据写入文件之前,先把字符串数据进行格式化,将设置了换行符 \n 的数据传递到 WriteString() 函数中,写入文件
image-20210606120856384
除了使用WriteString( )函数向文件中写入数据意外,还可以使用Write( )函数,如下所示:
str = fmt.Sprintf("Hello World, i = %d\n", i) // 对字符串进行格式化,设置换行\n
buf := []byte(str) // 将字符串转为byte切片
n, err := file.Write(buf) // 使用Write()函数写入数据
image-20210606121954101
在这里要注意的是,使用Write( )函数写数据时,参数为字节切片,所以需要将字符串转换成字节切片。该方法返回的也是写入文件数据的长度
第三种写入的方式使用WriteAt( )函数,在指定的位置写入数据
// 对字符串进行格式化,设置换行\n
str = fmt.Sprintf("Hello World, i = %d\n", i)
// 将字符串转为byte数组
buf := []byte(str)
//查看文件末尾的偏移量
seek, _ := file.Seek(0, os.SEEK_END)
// 从末尾的偏移量开始写入内容
n, err := file.WriteAt(buf, seek)
image-20210606122350201
以上程序中Seek( )函数返回值存储到变量seek中,值为文件末尾的位置。WriteAt( )也返回的是写入的数据长度。
“以上就是我们常用的关于向文件中写入数据的方式,但是有同学可能有疑问,每次向文件中写入数据之前,都是先执行了,Create( )这个函数,而这个函数的作用前面我们也已经说过,有两个作用:第一:创建新文件。第二:如果所创建的文件已经存在,会删除掉文件中存储的数据。那么,现在怎样向已有的文件中追加数据呢? ”
如果要解决这个问题,那么大家一定要注意的就是,对已经存在的文件不能再执行Create( ),而是要执行OpenFile( ).
//打开文件的用法:
file, err := os.OpenFile(path, os.O_APPEND, 6)
//OpenFile( )这个函数有三个参数,第一个参数表示打开文件的路径,第二个参数表示模式,常见的模式有
O_RDONLY(只读模式),O_WRONLY(只写模式),O_RDWR( 可读可写模式),O_APPEND(追加模式)。
第三个参数,表示权限,取值范围(0-7)
表示如下:
0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3:写权限与执行权限
4:读权限
5:读权限与执行权限
6:读权限与写权限
7:读权限,写权限,执行权限
如下所示:
image-20210606124705687
func WriteFile(path string) {
//打开文件
file, err := os.OpenFile(path, os.O_APPEND, 6)
if err != nil { // 如果有错误,打印错误,同时返回
fmt.Println("err = ", err)
return
}
// 写入数据到文件中
var str string
for i := 1; i < 10; i++ {
str = fmt.Sprintf("Openfile, i = %d\n", i) // 对字符串进行格式化,设置换行\n
n, err := file.WriteString(str)
fmt.Println("写入数据的长度:", n)
// 打印写入数据的错误信息
if err != nil {
fmt.Println("写入数据的错误信息:", err)
}
}
defer file.Close() // 在退出整个函数时,关闭文件
}
func main() {
var filePath = "a.txt"
WriteFile(filePath)
}