ioutil、os和bufio比较
参考文章:http://zmj.plus/2020/08/21/go-os.File%E3%80%81bufio%E3%80%81ioutil%20%E6%AF%94%E8%BE%83/
效率比较
当读取小文件时,使用ioutil效率明显优于os和bufio,但如果是大文件,bufio读取会更快。
读取一行内容时比较
读取文件中一行内容时,ReadSlice和ReadLine性能优于ReadBytes和ReadString,但由于ReadLine对换行的处理更加全面(兼容\n和\r\n换行),因此,实际开发过程中,建议使用ReadLine函数。
读文件
ioutil.ReadFile直接读取文件所有内容
path := "lposoc.log"
bytes,err := ioutil.ReadFile(path)
fmt.Println(string(bytes),err)
ioutil.ReadAll读出文件所有内容
path := "lposoc.log"
file,err := os.Open(path)
if err != nil {
fmt.Println("文件打开失败",err.Error())
}
defer file.Close()
bytes, err := ioutil.ReadAll(file)
fmt.Println(string(bytes),err)
bufio.NewScanner逐行读取文件
path := "lposoc.log"
file,err := os.Open(path)
if err != nil {
fmt.Println("文件打开失败",err.Error())
}
defer file.Close()
scanner := bufio.NewScanner(file)
i := 0
for scanner.Scan() {
fmt.Println(i,scanner.Text())
i++
}
reader.ReadLine 读取
path := "lposoc.log"
file,err := os.Open(path)
if err != nil {
fmt.Println("文件打开失败",err.Error())
}
defer file.Close()
reader:= bufio.NewReader(file)
for {
line, isPrefix, err := reader.ReadLine()
if err != nil {
if err != io.EOF {
fmt.Println(err)}
break
} else {
fmt.Println(isPrefix, err, string(line))}
}
写文件
以下操作若文件不存在都会自动创建
文件追加
path := "user.log"
file, err = os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm)
if err != nil {
fmt.Println("文件写入错误",err.Error())
}
file.WriteString(strconv.FormatInt(time.Now().Unix(), 10))
file.WriteString("\n")
file.Close()
文件覆盖写入
file, err := os.Create("user.txt")
if err != nil {
fmt.Println("文件写入错误",err.Error())
}
defer file.Close()
writer := bufio.NewWriter(file)
writer.WriteString("abcdef\n")
writer.Write([]byte("123456\n"))
writer.Flush()
直接覆盖写入文件
err := ioutil.WriteFile("user.txt", []byte("写入文件的内容"), os.ModePerm)
fmt.Println(err)
目录操作
# 创建目录并指定权限
os.Mkdir("astaxie", 0777)
# 递归创建目录并指定权限
os.MkdirAll("astaxie/test1/test2", 0777)
# 删除目录
err := os.Remove("astaxie")
if err != nil {
fmt.Println(err)
}
# 递归删除目录
os.RemoveAll("astaxie")
判断文件或目录是是否存在
func isFileExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
exists, err := isFileExists("configs")
fmt.Println(exists,err)