地址:https://github.com/polaris1119/The-Golang-Standard-Library-by-Example/blob/master/chapter01/01.4.md
上面的地址介绍了基本的使用,以及在readslice的坑上面做了解释。
使用的场景中代码如下,mapreduce中对文件根据map数分块:
// 执行mapreduce前会先将分块来进行处理
func (mr *MapReduce) Split(fileName string) {
fmt.Printf("Split %s\n", fileName)
infile, err := os.Open(fileName)
if err != nil {
log.Fatal("Split: ", err)
}
defer infile.Close()
// 返回文件的基本信息
fi, err := infile.Stat()
if err != nil {
log.Fatal("Split: ", err)
}
// 返回文件的大小
size := fi.Size()
// 得到文件每块的大小,按照map数来分块
nchunk := size / int64(mr.nMap)
nchunk += 1
//kjv12.txt-0
outfile, err := os.Create(MapName(fileName, 0))
if err != nil {
log.Fatal("Split: ", err)
}
//缓存的io的写操作
writer := bufio.NewWriter(outfile)
m := 1
i := 0
//一块一块的进行读取;创建一个读取文件的scanner
scanner := bufio.NewScanner(infile)
// 存在数据就会一直扫描下去
for scanner.Scan() {
if int64(i) > nchunk*int64(m) {
// 清除原来的缓存
writer.Flush()
outfile.Close()
// 创建第二个write
outfile, err = os.Create(MapName(fileName, m))
writer = bufio.NewWriter(outfile)
m += 1
}
// 一行一行的读取数据
line := scanner.Text() + "\n"
writer.WriteString(line)
i += len(line)
}
writer.Flush()
outfile.Close()
}
有疑问加站长微信联系(非本文作者)