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) }
|
写入
写入使用的是bufio
中writer
对象的一些方法。
1 2 3 4 5 6 7
| 以下三个方法可以直接写入到文件中
func (b *Writer) WriteByte(c byte) error
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 读取文件 - 概览