go读写文件

读取文件

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

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

将文件整个读入内存

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)
}
0%