地址: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() }
有疑问加站长微信联系(非本文作者)