golang bufio浅析
发布日期:2021-05-10 23:13:03 浏览次数:17 分类:精选文章

本文共 2185 字,大约阅读时间需要 7 分钟。

读取操作

bufio在读取文件时,会将要读取或缓冲的内容存储在内部缓冲区中。以下是详细的读取过程:

func bufIoRead() { file := "./test-file" fd, err := os.Open(file) if err != nil { panic(err) } defer fd.Close() b := bufio.NewReaderSize(fd, 100) ctx := make([]byte, 30) var buf bytes.Buffer fmt.Println("b size is: ", b.Size()) if _, err := b.Read(ctx); err != nil { panic(err) } buf.Write(ctx) fmt.Println(buf.String()) fmt.Println("剩余缓冲大小: ", b.Buffered()) _, err = b.Read(ctx) if err != nil { panic(err) } buf.Write(ctx) fmt.Println(buf.String()) fmt.Println("剩余缓冲大小: ", b.Buffered()) }

在这个函数中:

  • 首先,打开目标文件文件。
  • 初始化一个大小为100字节的缓冲区读取器。
  • 创建一个临时缓冲区来存储读取的数据。
  • 读取缓冲区中的数据,并将其写入临时缓冲区。
  • 打印当前缓冲区的大小和已读取数据。
  • 再次读取缓冲区中的数据,更新已读取内容并打印。
  • 写入操作

    bufio在写入文件时,也提供了缓存机制。以下是详细的写入过程:

    func bufIoWrite() { file := "./test-file" fd, err := os.OpenFile(file, os.O_RDWR, os.ModeAppend) if err != nil { panic(err) } defer fd.Close() cacheSize := 10 b := bufio.NewWriterSize(fd, cacheSize) txt := []byte("world ") if _, err := b.Write(txt); err != nil { panic(err) } cxt := make([]byte, 100) if _, err := fd.Read(cxt); err != nil { if err == io.EOF { fmt.Println("file is empty.") } else { panic(err) } } fmt.Println("before flush cache: ", string(cxt)) fmt.Println("number of bytes that have been written into cache: ", b.Buffered()) fmt.Println("how many bytes are unused in the cache: ", b.Available()) if err := b.Flush(); err != nil { panic(err) } fmt.Println("after flush, number of bytes that have been written into cache: ", b.Buffered()) fmt.Println("after flush, number of bytes are unused in the cache: ", b.Available()) if _, err := fd.ReadAt(cxt, 0); err != nil { if err == io.EOF { fmt.Println("file is empty.") } else { panic(err) } } fmt.Println("after flush cache: ", string(cxt)) }

    在这个函数中:

  • 打开目标文件文件,设置读写权限。
  • 创建一个大小为10字节的缓冲区写入器。
  • 准备要写入的文本内容。
  • 将文本内容直接写入缓冲区。
  • 读取当前缓冲区的内容并打印。
  • 检查缓冲区是否已满,如果是,则将缓冲区内容写入文件并清空缓冲区。
  • 再次读取文件内容,验证缓冲区是否已正确写入。
  • 文件扫描操作

    bufio还可以用于文件扫描,即按行读取文件内容。以下是详细的扫描过程:

    func bufIoScanner() { f, err := os.Open("./test-file") if err != nil { panic(err) } scanner := bufio.NewScanner(f) scanner.Scan() fmt.Println(scanner.Text()) for scanner.Scan() { line := scanner.Text() fmt.Println(line) } }

    在这个函数中:

  • 打开目标文件文件。
  • 创建一个新的文件扫描器。
  • 读取并打印文件的第一行内容。
  • 循环读取并打印剩余的每一行内容。
  • 上一篇:go bytes 浅析
    下一篇:go 使用http长连接读写influxdb

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月13日 11时20分19秒