文件操作

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

友情链接更多精彩内容