文件操作

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容