<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Golang文件操作-上篇

          共 8585字,需瀏覽 18分鐘

           ·

          2021-09-17 14:39

          目錄

          • 1、讀文件

          • 2、寫(xiě)文件

          • 3、文件指針

          • 4、ioutil文件操作

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

            • 4.2 readfile直接讀文件

            • 4.3 writefile直接寫(xiě)文件

          • 5、bufio帶緩沖IO

            • 5.1 scanner 逐行讀取

            • 5.2 帶緩沖IO reader

            • 5.3 帶緩沖IO writer


          1、讀文件

          讀文件的過(guò)程

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

          文件路徑

          • 絕對(duì)路徑:程序不管在什么位置運(yùn)行,打開(kāi)的文件都不會(huì)變化(從根路徑/盤(pán)符開(kāi)始書(shū)寫(xiě)的路徑)
          • 相對(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、寫(xiě)文件

          寫(xiě)文件的過(guò)程

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

          示例,文件寫(xiě)入

          package main

          import (
           "fmt"
           "os"
          )

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

          修改文件的過(guò)程

          • 追加

          OpenFile的常用幾種模式

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

          語(yǔ)法

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

          該方法第一個(gè)參數(shù)為文件路徑,第二個(gè)參數(shù)控制文件的打開(kāi)方式,第三個(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)存在,則在尾部添加寫(xiě)
           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)存在,則在尾部添加寫(xiě)
           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ì)位置
           // 文件開(kāi)始 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))  // 將指針?lè)诺轿募┪?/span>
           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直接寫(xiě)文件

          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)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产在线欧美豆花 | 日本家庭乱伦视频 | 91久久免费 | 在线无码电影 | 中文字幕亚洲第一 |