读取文件
读取文件一般有三种方式,不同读取模式的优缺点不同。
- 将文件整个读入内存。效率比较高,占用内存也最高
- 按字节读取。读取方式比较灵活,若文件较大,可以读取需要的部分
- 按行读取。一般用于文件日志文件读取
将文件整个读入内存
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)
}