读取大文件的方法

两种模式:
– 流式
– 分片

  1. 流式
// 文件一块一块的读取,buf为1k
func ReadBlockBy1KBuf(path string) {
    fi, err := os.Open(path)
    if err != nil {
        log.Println(err)
        return
    }
    defer fi.Close()
    // 设置每次读取字节数
    buffer := make([]byte, 1024)
    for {
        n, err := fi.Read(buffer)
        // 根据实际调整控制条件
        if err != nil && err != io.EOF {
            log.Println(err)
        }
        if n == 0 {
            break
        }
        // 如下代码打印出每次读取的文件块(字节数)
        //fmt.Println(string(buffer[:n]))
    }
}
  1. 分片
// 读取文件的每一行
func ReadEachLineReader(filePath string) {
    FileHandle, err := os.Open(filePath)
    if err != nil {
        log.Println(err)
        return
    }
    defer FileHandle.Close()
    lineReader := bufio.NewReader(FileHandle)
    for {
        // 相同使用场景下可以采用的方法
        // func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
        // func (b *Reader) ReadBytes(delim byte) (line []byte, err error)
        // func (b *Reader) ReadString(delim byte) (line string, err error)
        _, _, err := lineReader.ReadLine()
        if err == io.EOF {
            break
        }
        // 打印每次读取的文件行内容
        //fmt.Println(string(line))
    }
}

// 读取文件的每一行
func ReadEachLineScanner(filePath string) {
    FileHandle, err := os.Open(filePath)
    if err != nil {
        log.Println(err)
        return
    }
    defer FileHandle.Close()
    lineScanner := bufio.NewScanner(FileHandle)
    for lineScanner.Scan() {
        // 相同使用场景下可以使用如下方法
        // func (s *Scanner) Bytes() []byte
        // func (s *Scanner) Text() string
        // 打印每次读取的文件行内容
        //fmt.Println(lineScanner.Text())
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注