Golang 读、写文件
读取文件读取文件有三种方式:
- 将文件整个读入内存
- 按字节读取
- 按行读取
将文件整个读入内存
package main
import (
"os"
"io/ioutil"
"fmt"
)
func main() {
file, err := os.Open("D:/develop/log.txt")
if err != nil {
panic(err)
}
defer file.Close()
content, err := ioutil.ReadAll(file)
fmt.Println(string(content))
}
按字节读取文件
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
)
func main() {
filepath := "D:/develop/log.txt"
fi, err := os.Open(filepath)
if err != nil {
panic(err)
}
defer fi.Close()
r := bufio.NewReader(fi)
chunks := make([]byte, 0)
buf := make([]byte, 1024) //一次读取多少个字节
for {
n, err := r.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
fmt.Println(string(buf[:n]))
break
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 := "D:/develop/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
}
}
}
}
写文件
ioutil.WriteFile每次都会覆盖 test.txt内容,如果test.txt文件不存在会创建。
package main
import (
"io/ioutil"
)
func main() {
content := []byte("测试1\n测试2\n")
err := ioutil.WriteFile("test.txt", content, 0644)
if err != nil {
panic(err)
}
}
os在文件内容末尾添加新内容
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 = "测试1\n测试2\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()
n, err1 := io.WriteString(f, wireteString) //写入文件(字符串)
if err1 != nil {
panic(err1)
}
fmt.Printf("写入 %d 个字节n", n)
}
bufio文件内容末尾添加新内容
package main
import (
"bufio"
"fmt"
"os"
)
func checkFileIsExist(filename string) bool {
if _, err := os.Stat(filename); os.IsNotExist(err) {
return false
}
return true
}
func main() {
var str = "测试1\n测试2\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()
if err1 != nil {
panic(err1)
}
w := bufio.NewWriter(f) //创建新的 Writer 对象
n, _ := w.WriteString(str)
fmt.Printf("写入 %d 个字节n", n)
w.Flush()
}