Golang 文件操作 - 上篇

目錄

1、讀文件

讀文件的過程

文件路徑

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([]byte, 20)
  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、寫文件

寫文件的過程

示例,文件寫入

package main

import (
 "fmt"
 "os"
)

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

修改文件的過程

OpenFile 的常用幾種模式

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

語法

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

該方法第一個參數爲文件路徑,第二個參數控制文件的打開方式,第三個參數控制文件模式

示例,文件追加

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)  // 如果已經存在,則在尾部添加寫
 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)  // 如果已經存在,則在尾部添加寫
 if err == nil {
  log.SetOutput(file)
  log.SetPrefix("users: ")
  log.SetFlags(log.Flags() | log.Lshortfile)
  log.Print(time.Now().Unix())
  file.Close()
 }
}

最終的文件內容效果

users: 2021/08/19 00:48:20 log.go:16: 1629388100
users: 2021/08/19 00:48:32 log.go:16: 1629388112

3、文件指針

主要是利用seek修改光標位置,用的較少

package main

import (
 "fmt"
 "os"
)

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

4、ioutil 文件操作

4.1 readall 讀取文件所有內容

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([]byte, 5)
  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 讀

對文件的 "\n" 進行截斷

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 ~

仙人技術

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8puWfJ8e7ncSd6sUPtxB1Q