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

Sha*_*fax 11 io file go

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)
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

是不是也是正确的使用*File作为io.Reader?或者最好这样做r := ioutil.NewReader(data)

icz*_*cza 14

使用File.Seek(0, 0)正如您的建议,最简单地查找文件的开头,但不要忘记:

未指定使用O_APPEND打开的文件的Seek行为.

(但这不适用于您的示例.)

将指针设置为文件的开头总是比关闭和重新打开文件快得多.如果你需要阅读的文件不同,"小"的部分很多次,交替进行,那么也许它可能是有利可图开两次重复避免求(约合这种担心只有当你有peformance问题)的文件.

再次,File.Seek(0, io.SeekStart)实现*os.File,所以你可以使用它作为io.Reader.我不知道io.Reader你在问题中提到了什么(包ioutil.NewReader(data)没有这样的功能;也许你的意思io/ioutil?),但当然不需要从文件中读取.