2019年第一篇博客
兜兜转转又回来更新go的博客了,今天来讲一下如何使用golang进行文件的读写
文件读写需要使用的包
- os
- ioutil
- bufio
- strings
文件读写总是少不了判断文件是否存在!
go里面使用os.Stat 和 os.IsNotExist 相结合来判断文件是否存在
os.Stat 是用来获取文件的相关信息的,比如文件大小,最近一次修改时间等,但是假如文件不存在就返回error
我们就需要这个error 然后IsNotExist 判断 有 error说明文件不存在
show me your code?
// 判断文件是否存在
if _, err := os.Stat(filename); os.IsNotExist(err) {
return err
}
按行读文件
这里我使用了ioutil.ReadFile() 需要注意的是这个返回的是[]byte 类型的,需要转为string 才是我们可读的样子
按行读取有两种方式 1 读取整个文件然后按照\n 分割,再循环读取 2 使用ioutil.ReadLine
func Readlines(filename string) {
// go 按行读取文件的方式有两种,
// 第一 将读取到的整个文件内容按照 \n 分割
// 使用bufio
// 第一种
lines, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println(err)
} else {
contents := string(lines)
lines := strings.Split(contents, "\n")
for _, line := range lines {
fmt.Println(line)
}
}
// 第二种
fd, err := os.Open(filename)
defer fd.Close()
if err != nil {
fmt.Println("read error:", err)
}
buff := bufio.NewReader(fd)
for {
data, _, eof := buff.ReadLine()
if eof == io.EOF {
break
}
fmt.Println(string(data))
}
}
写文件
我这里的写文件是写入一个已经存在的文件,需要特别注意的是使用os.Open方式是只读的方式打开的,这样无法写入也没有报错
所以应该使用os.OpenFile 指定打开的方式为 os.O_RDWR|os.O_APPEND 这样才能使用写入,并且会追加写入
,只使用os.O_RDWR,每次都是覆盖写入,os.O_APPEND 无法写入
func WriterTXT(filename, content string) error {
// 写入文件
// 判断文件是否存在
if _, err := os.Stat(filename); os.IsNotExist(err) {
return err
}
fd, err := os.OpenFile(filename, os.O_RDWR|os.O_APPEND, 0666)
defer fd.Close()
if err != nil {
return err
}
w := bufio.NewWriter(fd)
_, err2 := w.WriteString(content)
if err2 != nil {
return err2
}
w.Flush()
fd.Sync()
return nil
}