缓冲区方式
使用bufio缓冲读写文件,通过工厂模式获取对应结构体。
在创建的时候,读取文件内容。提供添加和覆盖两种修改文件的方式。
package utils
import (
"bufio"
"fmt"
"io"
"os"
)
type fileOperator struct {
path string
data string
}
func (f *fileOperator) GetData() string {
return f.data
}
func (f *fileOperator) GetPath() string {
return f.path
}
func (f *fileOperator) write(content string, op int) {
var file, err = os.OpenFile(f.path, op, 0666)
if err != nil {
fmt.Printf("write file err: %v \n", err)
return
}
defer file.Close()
var writer = bufio.NewWriter(file)
writer.WriteString(content)
//writer有缓冲区,所以退出时必须使用Flush将缓冲区数据写入到文件
writer.Flush()
}
func (f *fileOperator) CoverContent(content string) {
f.data = content
// 直接覆盖文件
f.write(content, os.O_WRONLY|os.O_TRUNC)
}
func (f *fileOperator) AddContent(content string) {
f.data += content
// 在文件后面添加
f.write(content, os.O_WRONLY|os.O_APPEND)
}
// init
func FileOperator(path string) *fileOperator {
var obj = fileOperator{
path: path,
data: "",
}
// 如果文件不存在,则根据路径创建文件
if _, err := os.Stat(path); err != nil {
_, err = os.Create(path)
if err != nil {
fmt.Printf("file create error: %v\n", err)
}
}
// 获取文件对象
var file, err = os.OpenFile(path, os.O_RDONLY, 0)
if err != nil {
fmt.Printf("file init err: %v\n", err)
return nil
}
defer file.Close()
// 读取文件数据
var reader = bufio.NewReader(file)
for {
var line, err = reader.ReadString('\n')
if err != nil {
if err == io.EOF {
if len(line) > 0 {
obj.data += line
}
}
break
} else {
obj.data += line
}
}
return &obj
}
调用方式如下
package main
import (
"learnGo/utils"
)
func main() {
var content = "abc\n"
for i := 0; i < 2; i++ {
content += content
}
var htmlData = utils.FileOperator("./data/data.txt")
htmlData.CoverContent(content)
}