Golang,一种回放文件指针的正确方法

时间:2017-02-15 09:21:54

标签: file go io

package main

import (
    "bufio"
    "encoding/csv"
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    data, err := os.Open("cc.csv")
    defer data.Close()
    if err != nil {
        log.Fatal(err)
    }

    s := bufio.NewScanner(data)
    for s.Scan() {
        fmt.Println(s.Text())
        if err := s.Err(); err != nil {
            panic(err)
        }
    }
    // Is it a proper way?
    data.Seek(0, 0)
    r := csv.NewReader(data)

    for {
        if record, err := r.Read(); err == io.EOF {

            break
        } else if err != nil {
            log.Fatal(err)
        } else {
            fmt.Println(record)
        }

    }
}

我在这里使用两个读取器来读取csv文件。 要回放文件我使用data.Seek(0, 0)这是一个好方法吗?或者最好关闭文件并在第二次阅读之前再次打开。

*File用作io.Reader是否正确?或者最好做r := ioutil.NewReader(data)

1 个答案:

答案 0 :(得分:13)

使用File.Seek(0, 0)(或者更安全地使用常量:File.Seek(0, io.SeekStart))来查找文件的开头最简单,就像你建议的那样,但不要忘记:

  

未指定使用O_APPEND打开的文件的搜索行为。

(但这不适用于你的例子。)

将指针设置为文件的开头总是比关闭和重新打开文件快得多。如果您需要阅读文件的“小”部分许多次,交替,那么可能打开文件两次以避免重复搜索(担心)可能是有利可图的只有当你遇到性能问题时才会这样做。)

同样,*os.File会实现io.Reader,因此您可以将其用作io.Reader。我不知道你在问题中提到的是什么ioutil.NewReader(data)(包io/ioutil没有这样的功能;也许你的意思是bufio.NewReader()?),但当然不需要从文件。