Go语言文件操作
1、使用os包读取文件的内容
// 自定义每次读取数据长度
func ReadFileFromOS() {
file, err := os.Open("./abc")
if err != nil {
fmt.Printf("open file fail,err: %+v\n", err)
return
}
// 关闭文件
defer file.Close()
// 定义一个长度为10的切片
b := make([]byte, 10)
for {
n, err := file.Read(b)
// _, err := file.Read(b)
if err == io.EOF {
// EOF表示end of file,文件读取完毕
return
}
if err != nil {
fmt.Printf("read file fail,err: %+v\n", err)
return
}
// 打印读出的内容
// 将切片转化为string,然后打印
fmt.Printf("读取字节数:%d\n", n)
fmt.Print(string(b))
}
}
在方法file.Read(b)中,入口参数是一个切片,切片的长度就是每次从文件中读取数据打长度,当文件中剩余内容小于这个切片的长度的时候,就读文件的剩下的内容,而不是切片的长度那样多的内容。当文件读到最后的时候,file.Read()返回一个文件结束信息,io.EOF
2、使用bufio包读取文件内容
bufio也是一个可以用来读取文件的包
// 使用bufio包读文件
func ReadFileFromBufio() {
file, err := os.Open("./abc")
if err != nil {
fmt.Printf("open file fail,err: %+v\n", err)
return
}
// 关闭文件
defer file.Close()
newReader := bufio.NewReader(file)
for {
// 使用函数ReadString('\n')表示每次读取一个字符串,遇到'\n'表示读取当前字符串结束
line, err := newReader.ReadString('\n')
if err == io.EOF {
return
}
if err != nil {
fmt.Printf("read file fail,err: %+v\n", err)
}
fmt.Print(line)
}
}
使用这种方法就是创建一个Reader变量,用来读取文件内容,Reader包含的方法包括ReadLine,ReadString等等,同样的读到文件最后会返回文件结束符io.EOF
3、使用io/ioutil包一次性读取文件内容,这个方法比较简单
// 使用io/ioutil包读取文件内容
func ReadFileFromIOutil() {
// content是一个byte类型的切片
content, err := ioutil.ReadFile("./abc")
if err != nil {
fmt.Printf("read file fail,err: %+v\b", err)
return
}
fmt.Println(string(content))
}
它可以一次性读取文件的所有内容,而不需要使用循环来读取
4、使用os包的Write方法和WriteString方法向文件写入数据
此时打开文件的方法是os.OpenFile()而不是os.Open()方法
os.OpenFile(name string,flag int,perm FileMode)(*File,error)
值得注意的是参数flag,就相当于c语言中打开文件的r,w,a等等标志,表示打开文件的模式,例如只读,只写,在后面添加等等
| os.O_WRONLY | 只写 |
| os.O_CREATE | 创建文件 |
| os.O_RDONLY | 只读 |
| os.O_RDWR | 读和写 |
| os.O_TRUNC | 清空文件,重新写 |
| os.O_APPEND | 在文件末尾添加 |
第三个参数perm就是linux中的文件权限,例如0777,0666等等
func WriteFileByOs() {
// 包含两个方法,Write和WriteString
file, err := os.OpenFile("./def", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
if err != nil {
fmt.Printf("open or create file fail,err: %+v\n", err)
return
}
defer file.Close()
// 直接使用Write和WriteString方法向文件写入数据,前者写入的类型为切片,后者为字符串
file.Write([]byte("abc def hello world\n")) //强制类型转换,将字符串转化为byte类型的切片
file.WriteString("hello baby\n")
file.WriteString("gyy 110")
}
5、使用bufio包对文件进行写入数据
与bufio中的reader读对象相对应的还有一个写对象writer,操作方式如下:
func WriteFileByBufio() {
// 与reader相对应的右writer
file, err := os.OpenFile("./def", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0777)
if err != nil {
fmt.Printf("open or create file fail,err: %+v\n", err)
return
}
defer file.Close()
newWriter := bufio.NewWriter(file)
// 将要写入文件的内容先写入缓冲区
newWriter.Write([]byte("ggg lol aaa\n"))
newWriter.WriteString("abc is a pig\n")
// 将缓冲区中的数据写入文件
newWriter.Flush()
}
在使用这种方法写入数据的时候,一定要记得在最后调用writer.Flush()方法将缓冲区中的内容写入文件。
6、最后就是使用io/ioutil包对文件写数据
前面我们已经说了使用ioutil包的方法,ioutil.ReadFile()方法进行整个文件的读取,那么ioutil包中还有一个方法ioutil.WriteFile()对整个文件进行写入数据,他的默认的模式是当文件不存在的时候,创建文件,当文件中原来有数据,就删掉原来的数据,然后重新从头写入
func WriteFileByIOutil() {
// 使用ioutil包中的方法,可以直接向文件写入数据
str := "cyl is a cute girl\n"
err := ioutil.WriteFile("./def", []byte(str), 0777)
if err != nil {
fmt.Printf("write data to file fail,err: %+v\n", err)
return
}
}
浙公网安备 33010602011771号