golang 中读取文件有很多方法,本文介绍用bufio包如何逐行进行读取和写入。因为bufio包提供了缓冲,性能比较优秀。

读取

逐行存入切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func readLines(path string) ([]string, int, error) {
file, err := os.Open(path)
if err != nil {
return nil,0, err
}
defer file.Close()

var lines []string
linecount :=0
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
linecount++
}
return lines,linecount,scanner.Err()
}

使用bufio包的scanner可以对数据进行扫描输入,除了逐行分割以外,还有其他的分割方式:
ScanLines(默认)
ScanWords(分割单词)
ScanRunes(在遍历 UTF-8 字符串而不是字节时将会非常有用)
ScanBytes

逐单词存入切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
file, err := os.Open("filetoread.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()

scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)

var words []string

for scanner.Scan() {
words = append(words, scanner.Text())
}

fmt.Println("word list:")
for _, word := range words {
fmt.Println(word)
}

写入

写入使用的是bufiowriter对象的一些方法。

1
2
3
4
5
6
7
以下三个方法可以直接写入到文件中
//写入单个字节
func (b *Writer) WriteByte(c byte) error
//写入单个Unicode指针返回写入字节数和错误信息
func (b *Writer) WriteRune(r rune) (size int, err error)
//写入字符串并返回写入字节数和错误信息
func (b *Writer) WriteString(s string) (int, error)

逐行写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func writeLines(path string, lines []string) error{
file, err := os.Create(path)
if err != nil {
return err
}
defer file.Close()
writer := bufio.NewWriter(file)

for _,elem := range lines {
_,err = writer.WriteString(elem + "\n")
}
return err
}

参考资料

Golang读写文件操作
使用 Go 读取文件 - 概览