读取文件

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

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

将文件整个读入内存

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