美文网首页
golang bufio 缓冲io

golang bufio 缓冲io

作者: copyLeft | 来源:发表于2019-08-23 09:42 被阅读0次

    读取缓冲区 Reader

    创建读取对象

    • NewReader 创建默认大小的缓冲区
    • NewReaderSize 创建指定大小的缓冲区
    • Reader.Buffered 获取缓存可读取字节数
    • Reset 丢弃当期缓存数据, 所以丢弃的长度与缓冲区大小相关
    
    if f, err := os.OpenFile("./mock.json", os.O_RDWR, os.ModelAppend); err == nil{
        
        // 创建缓冲区
        buf := bufio.NewReader(f)
        
        // 创建指定大小buff
        // bufCache := bufio.NewReaderSize(f, 50)
    
           
        // 获取当前缓冲区可读字节数
        fmt.Printf("\n %d \n", bufCache.Buffered())
    
    }
    
    

    读取缓冲数据

    
    
    
    // 需要为 []byte 字节切片开创内存空间
    cache := make([]byte, 100)
    
    // 将读取数据存入, 字节切片中. 返回读取数及错误信息
    num, _ := bufCache.Read(cache)
    
    fmt.Printf("\n%d: %s", num, string(cache))
    
    
    f, _ := os.OpenFile("./mock.json", os.O_RDWR, os.ModeAppend)
    
        bufCache := bufio.NewReaderSize(f, 1)
    
        //以换行符为断点,读取数据
        var str string
        var buf []byte
        var err error
        for err == nil {
    
            buf, err = bufCache.ReadBytes('\n')
            fmt.Println("from buff: ", string(buf))
    
            // 直接读取字符串
            str, err = bufCache.ReadString('\n')
            fmt.Println("from string: ", str)
        }
        
        
    // 主要:因为使用的是同一缓冲区, 无论使用哪种读取方法,都将影响下次读取。
    
    

    写入缓冲区 Writer

    新建缓冲区

    
    
        
        f, _ := os.OpenFile("./mock.json", os.O_RDWR, os.ModeAppend)
        
        // 创建缓冲区
        writerBuff := bufio.NewWriter(f)
    
        dataSize := writerBuff.Buffered()
        surplus := writerBuff.Available()
        fmt.Println(dataSize, surplus)
    
    

    写入数据

    
    
    
    // 逐行读取,转为大写
    func main() {
    
        srouce, _ := os.OpenFile("./srouce.json", os.O_RDWR, os.ModeAppend)
        target, _ := os.OpenFile("./target.json", os.O_RDWR, os.ModeAppend)
    
        readerBuff := bufio.NewReader(srouce)
        writerBuff := bufio.NewWriter(target)
    
        var num int
        var str string
        var err error
    
        for err == nil {
    
            // 逐行读取
            str, err = readerBuff.ReadString('\n')
    
            fmt.Printf("\n%d %s", num, str)
    
            num++
    
            // 逐行写入
            writerBuff.WriteString(strings.ToUpper(str))
            
            // 提交写入
            writerBuff.Flush()
    
        }
    
    
    
    }
    
    
    
    
    
    
    // 拷贝文件内容
        srouce, _ := os.OpenFile("./mock.json", os.O_RDWR, os.ModeAppend)
        target, _ := os.OpenFile("./target.json", os.O_RDWR, os.ModeAppend)
    
    
        writerBuff := bufio.NewWriter(target)
        
        // 从 io.Reader 直接获取数据
        writerBuff.ReadFrom(srouce)
    
    

    可读写缓冲区

    该缓冲区是 Reader Writer 接口集合对象 { *Reader, *Writer }

    Scanner

    带处理函数的缓冲区

    Scanner 方法

    
    package main
    import (
      "bufio"
      "fmt"
      "os"
    )
    func main() {
        
      // 将标准输入作为数据源
      scanner := bufio.NewScanner(os.Stdin)
      
      // 设置处理函数
      scanner.Split(bufio.ScanLines)
      
      for scanner.Scan()  {
      
        // 以字符串形式输出
        fmt.Println(scanner.Text())
      }
    }
    
    

    bufio 默认 Scanner 处理方法

    其他

    相关文章

      网友评论

          本文标题:golang bufio 缓冲io

          本文链接:https://www.haomeiwen.com/subject/emqzsctx.html