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/
效率比較
當(dāng)讀取小文件時,使用ioutil效率明顯優(yōu)于os和bufio,但如果是大文件,bufio讀取會更快。
讀取一行內(nèi)容時比較
讀取文件中一行內(nèi)容時,ReadSlice和ReadLine性能優(yōu)于ReadBytes和ReadString,但由于ReadLine對換行的處理更加全面(兼容\n和\r\n換行),因此,實(shí)際開發(fā)過程中,建議使用ReadLine函數(shù)。
讀文件
ioutil.ReadFile直接讀取文件所有內(nèi)容
path := "lposoc.log"
bytes,err := ioutil.ReadFile(path)
fmt.Println(string(bytes),err)
ioutil.ReadAll讀出文件所有內(nèi)容
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))}
}
寫文件
以下操作若文件不存在都會自動創(chuàng)建
文件追加
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("寫入文件的內(nèi)容"), os.ModePerm)
fmt.Println(err)
目錄操作
# 創(chuàng)建目錄并指定權(quán)限
os.Mkdir("astaxie", 0777)
# 遞歸創(chuàng)建目錄并指定權(quán)限
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)