1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Golang文件操作-上篇

        共 8585字,需瀏覽 18分鐘

         ·

        2021-09-17 14:39

        目錄

        • 1、讀文件

        • 2、寫文件

        • 3、文件指針

        • 4、ioutil文件操作

          • 4.1 readall讀取文件所有內(nèi)容

          • 4.2 readfile直接讀文件

          • 4.3 writefile直接寫文件

        • 5、bufio帶緩沖IO

          • 5.1 scanner 逐行讀取

          • 5.2 帶緩沖IO reader

          • 5.3 帶緩沖IO writer


        1、讀文件

        讀文件的過程

        • 文件位置
        • 打開文件
        • 讀取文件內(nèi)容(逐個(gè)字符讀、按批讀,只能按照字節(jié)切片讀)
        • 關(guān)閉文件

        文件路徑

        • 絕對(duì)路徑:程序不管在什么位置運(yùn)行,打開的文件都不會(huì)變化(從根路徑/盤符開始書寫的路徑)
        • 相對(duì)路徑:與程序的位置有關(guān)(程序放置的位置、程序運(yùn)行的位置)
        package main

        import (
         "fmt"
         "io"
         "os"
        )

        func main()  {
         path := "user.txt"
         file, err := os.Open(path)
         if err != nil {
          fmt.Println(err)
         } else {
          //fmt.Println(file)  // &{0xc0000b2120}  *os.File指針類型
          //var bytes []byte = make([]byte, 20)
          //n, err := file.Read(bytes)
          //fmt.Println(n ,err)
          //fmt.Println(string(bytes[:n]))
          bytes := make([]byte20)
          for {
           n, err := file.Read(bytes)
           if err != nil {
            if err != io.EOF {
             fmt.Println(err)
            }
            break
           } else {
            fmt.Print(string(bytes[:n]))
           }
          }
          file.Close()
         }
        }

        2、寫文件

        寫文件的過程

        • 創(chuàng)建文件
        • 寫入內(nèi)容(可以寫字符串或字節(jié)切片)
        • 關(guān)閉文件

        示例,文件寫入

        package main

        import (
         "fmt"
         "os"
        )

        func main() {
         path := "user2.txt"
         file, err := os.Create(path)
         if err != nil {
          fmt.Println(err)
         } else {
          // 寫文件,會(huì)把原來的內(nèi)容清空再寫
          file.Write([]byte("abc123!@#"))
          file.WriteString("xyz")
          // 關(guān)閉文件
          file.Close()
         }
        }

        修改文件的過程

        • 追加

        OpenFile的常用幾種模式

        os.O_WRONLY | os.O_CREATE | O_EXCL  【如果已經(jīng)存在,則失敗】
        os.O_WRONLY | os.O_CREATE   【如果已經(jīng)存在,會(huì)覆蓋寫,不會(huì)清空原來的文件,而是從頭直接覆蓋寫】
        os.O_WRONLY | os.O_CREATE | os.O_APPEND 【如果已經(jīng)存在,則在尾部添加寫】

        語法

        func OpenFile(name string, flag int, perm FileMode) (*File, error) 

        該方法第一個(gè)參數(shù)為文件路徑,第二個(gè)參數(shù)控制文件的打開方式,第三個(gè)參數(shù)控制文件模式

        示例,文件追加

        package main

        import (
         "os"
         "strconv"
         "time"
        )

        func main() {
         path := "user.log"
         file, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm)  // 如果已經(jīng)存在,則在尾部添加寫
         if err == nil {
          file.WriteString(strconv.FormatInt(time.Now().Unix(), 10))
          file.WriteString("\n")
          file.Close()
         }
        }

        將日志記錄到文件

        package main

        import (
         "log"
         "os"
         "time"
        )

        func main() {
         path := "user.log"
         file, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm)  // 如果已經(jīng)存在,則在尾部添加寫
         if err == nil {
          log.SetOutput(file)
          log.SetPrefix("users: ")
          log.SetFlags(log.Flags() | log.Lshortfile)
          log.Print(time.Now().Unix())
          file.Close()
         }
        }

        最終的文件內(nèi)容效果

        users: 2021/08/19 00:48:20 log.go:161629388100
        users: 2021/08/19 00:48:32 log.go:161629388112

        3、文件指針

        主要是利用seek修改光標(biāo)位置,用的較少

        package main

        import (
         "fmt"
         "os"
        )

        func main()  {
         file , _ := os.Open("user.txt")
         bytes := make([]byte100)
         n, _ := file.Read(bytes)
         fmt.Println(n, string(bytes[:n]))
         // 偏移量,相對(duì)位置
         // 文件開始 0 os.SEEK_SET
         // 當(dāng)前位置 1 os.SEEK_CUR
         // 文件末尾 2 os.SEEK_END
         fmt.Println(file.Seek(00))  // 偏移量、相對(duì)位置
         fmt.Println(file.Seek(01))  // 查看當(dāng)前偏移量
         fmt.Println(file.Seek(02))  // 將指針放到文件末尾
         n, err := file.Read(bytes)
         fmt.Println(n, err, string(bytes[:n]))
         file.Close()
        }

        4、ioutil文件操作

        4.1 readall讀取文件所有內(nèi)容

        package main

        import (
         "fmt"
         "io/ioutil"
         "os"
        )

        func main() {
         path := "user.txt"
         file, err := os.Open(path)
         if err != nil {
          fmt.Println(err)
         } else {
          defer file.Close()
          bytes, err := ioutil.ReadAll(file)
          fmt.Println(string(bytes), err)
         }
        }

        4.2 readfile直接讀文件

        package main

        import (
         "fmt"
         "io/ioutil"
        )

        func main() {
         bytes, err := ioutil.ReadFile("user.txt")
         if err == nil {
          fmt.Println(string(bytes))
         }
        }

        4.3 writefile直接寫文件

        package main

        import (
         "fmt"
         "io/ioutil"
         "os"
        )

        func main() {
         err := ioutil.WriteFile("user.txt", []byte("xxxxxxxxxxxxxxxxxxxxx"), os.ModePerm)
         fmt.Println(err)
        }

        5、bufio帶緩沖IO

        文檔:https://pkg.go.dev/bufio

        5.1 scanner 逐行讀取

        package main

        import (
         "bufio"
         "fmt"
         "os"
        )

        func main() {
         file, err := os.Open("user.txt")
         if err == nil {
          defer file.Close()
          i := 0
          scanner := bufio.NewScanner(file)
          for scanner.Scan() {
           fmt.Println(i, scanner.Text())
           i++
          }
         }
        }

        5.2 帶緩沖IO reader

        5.2.1 read 讀

        package main

        import (
         "bufio"
         "fmt"
         "io"
         "os"
        )

        func main()  {
         file, err := os.Open("user.txt")
         if err == nil {
          defer file.Close()
          reader := bufio.NewReader(file)
          bytes := make([]byte5)
          for {
           n , err := reader.Read(bytes)
           if err != nil {
            if err != io.EOF {
             fmt.Println(err)
            }
            break
           } else {
            fmt.Println(n, err, string(bytes))
           }
          }
         }
        }

        5.2.2 readline 讀

        對(duì)文件的"\n"進(jìn)行截?cái)?/p>

        package main

        import (
         "bufio"
         "fmt"
         "io"
         "os"
        )

        func main() {
         file, err := os.Open("user.txt")
         if err == nil {
          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))
           }
          }
         }
        }

        5.2.3 readstring、readslice 讀

        package main

        import (
         "bufio"
         "fmt"
         "io"
         "os"
        )

        func main() {
         file, err := os.Open("user.txt")
         if err == nil {
          defer file.Close()

          reader := bufio.NewReader(file)

          for {
           // line, err := reader.ReadSlice('\n')
           line, err := reader.ReadString('\n')
           if err != nil {
            if err != io.EOF {
             fmt.Println(err)
            }
            break
           } else {
            // fmt.Println(err, string(line))
            fmt.Println(err, line)
           }
          }
         }
        }

        5.3 帶緩沖IO writer

        帶緩沖writer示例

        package main

        import (
         "bufio"
         "os"
        )

        func main() {
         file, err := os.Create("user.txt")
         if err == nil {
          defer file.Close()
          writer := bufio.NewWriter(file)

          writer.WriteString("abcdef")
          writer.Write([]byte("123456"))
          writer.Flush()
         }
        }

        See you ~

        加群方式:公眾號(hào)消息私信“加群”或加我好友再加群均可

        瀏覽 52
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美性综合 | 一级片黄色网址 | 粉嫩小穴p | 992zyz玖玖资源站在线观看 | 五月丁香花在线视频 | 超碰在线观看2407 | 特黄一级电影 | 5D肉蒲团 | 色偷偷色偷偷色偷偷在线视频 | 91麻豆视频 |