bufio包实现了有缓冲的I/O,它封装了一个io.Reader或io.Write接口对象,创建一个实现实现了该接口,同时提供缓冲和一些文本I/O的帮助函数.
简单的说就是,把文件读取进缓冲(内存)之后再读取的时候就可以避免文件系统的io 从而提高速度。同理,在进行写操作时,先把文件写入缓冲(内存),然后由缓冲写入文件系统。看完以上解释有人可能会表示困惑了,直接把 内容->文件 和 内容->缓冲->文件相比, 缓冲区好像没有起到作用嘛。其实缓冲区的设计是为了存储多次的写入,最后一口气把缓冲区内容写入文件。下面会详细解释
bufio 封装了io.Reader或io.Writer接口对象,并创建另一个也实现了该接口的对象
io.Reader或io.Writer 接口实现read() 和 write() 方法,对于实现这个接口的对象都是可以使用这两个方法的
以下是bufio的简单使用:
func main() { fileName := "C:\\Users\\fcl18\\Desktop\\发言.txt" file, err := os.Open(fileName) if err != nil { fmt.Println("err", err) return } defer file.Close() // b1 := bufio.NewReader(file) //1,Read() 高效读取 // p := make([]byte, 1024) // n1, err1 := b1.Read(p) // if err1 != nil { // fmt.Println("err", err1) // return // } // fmt.Println(n1) // fmt.Println(string(p[:n1])) //2, ReadLine 比较低级 // data, flag, err := b1.ReadLine() // fmt.Println(data) // fmt.Println(flag) // fmt.Println(err) // fmt.Println(string(data)) //3, ReadString // str, err := b1.ReadString('\n') //读取一行 // fmt.Println(err) // fmt.Println(str) // str1, err1 := b1.ReadString('\n') //再读一行 // fmt.Println(err1) // fmt.Println(str1) // for { // s, err := b1.ReadString('\n') // if err == io.EOF { // fmt.Println("读取完毕") // break // } // fmt.Println(s) // } //4, ReadByte // data, err1 := b1.ReadBytes('\n') // fmt.Println(data) // fmt.Println(err1) //Scanln只读取空格前面的数据 // s2 := "" // fmt.Println("请输入:") // fmt.Scanln(&s2) // fmt.Println(s2) // b2 := bufio.NewReader(os.Stdin) // s2, _ := b2.ReadString('\n') //通过换行来表示读取完毕 // fmt.Println(s2) }
bufio写文件:
func main() { fileName := "C:\\Users\\fcl18\\Desktop\\cc.txt" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, os.ModePerm) if err != nil { fmt.Println("err", err) return } defer file.Close() w1 := bufio.NewWriter(file) for i := 1; i <= 1000; i++ { w1.WriteString(fmt.Sprintf("%d:hello", i)) } w1.Flush() //将缓冲区的内容写入 }
标签:io,err,fmt,Println,b1,bufio,Go,入坑 From: https://www.cnblogs.com/zlnfcl/p/16794384.html