美文网首页
go读写文件

go读写文件

作者: 岑吾 | 来源:发表于2021-12-19 20:05 被阅读0次

    读取文件

    读取文件一般有三种方式,不同读取模式的优缺点不同。

    • 将文件整个读入内存。效率比较高,占用内存也最高
    • 按字节读取。读取方式比较灵活,若文件较大,可以读取需要的部分
    • 按行读取。一般用于文件日志文件读取

    将文件整个读入内存

    package main
    
    import (
       "os"
       "io/ioutil"
       "fmt"
    )
    
    func main() {
       filepath := "./log.txt"
       content ,err :=ioutil.ReadFile(filepath)
       if err !=nil {
          panic(err)
       }
       fmt.Println(string(content))
    }
    

    按字节读取

    package main
    
    import (
       "fmt"
       "io"
       "os"
    )
    
    func main() {
    
       file := "./log.txt"
       f, err := os.Open(file)
       if err != nil {
          panic(err)
       }
       defer f.Close()
    
       chunks := make([]byte, 0)
       buf := make([]byte, 1024)
       for {
          n, err := f.Read(buf)
          if err != nil && err != io.EOF {
             panic(err)
          }
          if 0 == n {
             break
          }
          chunks = append(chunks, buf[:n]...)
       }
       fmt.Println(string(chunks))
    }
    

    按字行读取

    package main
    
    import (
    "bufio"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "strings"
    )
    
    func main() {
        filepath := "./log.txt"
        file, err := os.OpenFile(filepath, os.O_RDWR, 0666)
        if err != nil {
            fmt.Println("Open file error!", err)
            return
        }
        defer file.Close()
    
        stat, err := file.Stat()
        if err != nil {
            panic(err)
        }
        var size = stat.Size()
        fmt.Println("file size=", size)
    
        buf := bufio.NewReader(file)
        for {
            line, err := buf.ReadString('\n')
            line = strings.TrimSpace(line)
            fmt.Println(line)
            if err != nil {
                if err == io.EOF {
                    fmt.Println("File read ok!")
                    break
                } else {
                    fmt.Println("Read file error!", err)
                    return
                }
            }
        }
    }
    

    写入文件

    写入文件一般分为二种:

    • 写入整个文件,如果文件存在覆盖,不存在创建
    • 在文件尾部添加内容,一般用于日志流等

    写入整个文件

    package main
    
    import (
       "io/ioutil"
    )
    
    func main() {
    
       content := []byte("guoke\nzngw2\n")
       err := ioutil.WriteFile("test.txt", content, 0644)
       // 注意,如果写入的目录不存在会报错
       if err != nil {
          panic(err)
       }
    }
    

    在文件尾部添加内容

    package main
    
    import (
    "fmt"
    "io"
    "os"
    )
    
    func checkFileIsExist(filename string) bool {
        if _, err := os.Stat(filename); os.IsNotExist(err) {
            return false
        }
        return true
    }
    func main() {
        var wireteString = "guoke\nzngw2\n"
        var filename = "./test.txt"
        var f *os.File
        var err1 error
        if checkFileIsExist(filename) { //如果文件存在
            f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
            fmt.Println("文件存在")
        } else {
            f, err1 = os.Create(filename) //创建文件
            fmt.Println("文件不存在")
        }
        defer f.Close()
        n1, err1 := io.WriteString(f, wireteString) //写入文件(字符串)
        if err1 != nil {
            panic(err1)
        }
        fmt.Println("写入 %d 个字节", n1)
    
        n2, err2 := f.Write([]byte(wireteString)) //写入文件(字节)
        if err2 != nil {
            panic(err1)
        }
        fmt.Println("写入 %d 个字节", n2)
    }
    

    相关文章

      网友评论

          本文标题:go读写文件

          本文链接:https://www.haomeiwen.com/subject/snvofrtx.html