Golang基础之文件操作
目录
0、前言
在大多数语言中对于文件操作是必不可少的一个内容,那么在Go中os提供了文件的基本操作,除此以外为了追求便捷以及性能之上,Go 还在io/ioutil
以及bufio
提供一些其他函数供开发者使用
1、文件读取
1.1、os.open文件读取
os.open打开文件后赋给file然后通过read的方法读取并接收一个buf []byte 的参数类型,读取到文件末尾会返回0以及 io.EOF,可以通过0或者io.EOF进行判断文件是否读取完毕。
package main
import (
"fmt"
"os"
)
func main(){
fileObj,err := os.Open("./main.go")
if err != nil{
fmt.Printf("open file failed err: %v",err)
return
}
// 记得关闭文件
defer fileObj.Close()
// 使用Read方法读取文件数据
//var tmp = make([]byte,128) // 指定读的长度
var tmp [128]byte
n,err := fileObj.Read(tmp[:])
if err != nil{
fmt.Printf("read from file failed err: %v",err)
return
}
fmt.Printf("读了%d个字节\n",n)
fmt.Println(string(tmp[:n]))
}
1.2、os.open循环读取
上面这种方式是一次性读取128byte的文件,如果需要将文件都读取完,就需要用到循环读取
package main
import (
"fmt"
"os"
)
func main(){
fileObj,err := os.Open("./main.go")
if err != nil{
fmt.Printf("open file failed err: %v",err)
return
}
defer fileObj.Close()
// 使用Read方法读取文件数据
var tmp [128]byte
for {
n,err := fileObj.Read(tmp[:])
if err != nil{
fmt.Printf("read from file failed err: %v",err)
return
}
fmt.Printf("读了%d个字节\n",n)
fmt.Println(string(tmp[:n]))
if n < 128 {
return
}
}
}
1.3、bufio文件读取
bufio 顾名思义就是带 buffer 的 IO
package main
import (
"bufio"
"fmt"
)
func main(){
fileObj,err := os.Open("./main.go")
if err != nil{
fmt.Printf("open file failed err: %v",err)
return
}
defer fileObj.Close()
// 创建一个从文件中读内容的对象
reader := bufio.NewReader(fileObj)
line,err := reader.ReadString('\n') //注意是字符
if err == io.EOF {
return
}
if err != nil{
fmt.Printf("read line failed,err: %v",err)
return
}
fmt.Print(line)
}
1.4、bufio循环读取
package main
import (
"bufio"
"fmt"
)
func main(){
fileObj,err := os.Open("./main.go")
if err != nil{
fmt.Printf("open file failed err: %v",err)
return
}
defer fileObj.Close()
// 创建一个从文件中读内容的对象
reader := bufio.NewReader(fileObj)
for {
line,err := reader.ReadString('\n') //注意是字符
if err == io.EOF {
return
}
if err != nil{
fmt.Printf("read line failed,err: %v",err)
return
}
fmt.Println(line)
}
}
1.5、ioutil读取整个文件
io/ioutil
包的ReadFile
方法能够读取完整的文件,只需要将文件名作为参数传入
package main
import (
"fmt"
"io/ioutil"
)
func main(){
ret,err := ioutil.ReadFile("./main.go")
if err != nil {
fmt.Printf("read line failed,err: %v",err)
return
}
fmt.Println(string(ret))
}
2、文件写入
2.1、os.OpenFile文件写入
os.OpenFile()
函数能够以指定模式打开文件,从而实现文件写入相关功能,它还提供了WriteString和Write两种方法,具体使用哪种根据个人需求。如下
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
....
}
其中:
1.name:要打开的文件名
2.flag:打开文件的模式。模式有以下几种:
模式 | 描述 |
---|---|
os.O_WRONLY | 只写 |
os.O_CREATE | 创建文件 |
os.O_RDONLY | 只读 |
os.O_RDWR | 读写 |
os.O_TRUNC | 清空 |
os.O_APPEND | 追加 |
3.perm:文件权限,一个八进制数,r(读) 04、w(写) 02、x (执行) 01
package main
import (
"fmt"
"os"
)
func main(){
file,err := os.OpenFile("a.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
if err != nil{
fmt.Printf("open file failed err:%v",err)
return
}
defer file.Close()
str := "hello world\n"
file.Write([]byte(str)) // 写入字节切片数据
file.WriteString(str) // 直接写入字符串数据
}
2.2、bufio.NewWriter文件写入
bufio能够实现先将数据写入到缓存区,然后在从缓存中的内容写入到文件中。
package main
import (
"bufio"
"fmt"
"os"
)
func main(){
file,err := os.OpenFile("a.txt",os.O_CREATE|os.O_WRONLY|os.O_TRUNC,0644)
if err != nil{
fmt.Printf("open file failed err:%v",err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
str := "我的世界,由我做主\n"
writer.WriteString(str) // 先将数据写入到缓存
writer.Flush() // 将缓存中的内容写入文件中
}
2.3、ioutil.WriteFile文件写入
package main
import (
"fmt"
"io/ioutil"
)
func main(){
str := "我的世界,你的世界\n"
err := ioutil.WriteFile("a.txt",[]byte(str),0666)
if err != nil {
fmt.Printf("open file failed err:%v",err)
return
}
}