io.Copy()擦除阅读器内容

  • 本文关键字:擦除 Copy io go
  • 更新时间 :
  • 英文 :

    package main
    import (
        "fmt"
        "io"
        "io/ioutil"
        "os"
    )
    func main() {
        file, err := os.Open("HelloWorld")
        if nil != err {
            fmt.Println(err)
        }
        defer file.Close()
        fileTo, err := os.Create("fileTo")
        if nil != err {
            fmt.Println(err)
        }
        defer file.Close()
        _, err = io.Copy(fileTo, file)
        if nil != err {
            fmt.Println(err)
        }
        fileByteOne, err := ioutil.ReadAll(file)
        if nil != err {
            fmt.Println(err)
        }
        fmt.Println(fileByteOne)
    }

io.Copy((将擦除文件内容,输出为:

[]

Copy(dst Writer,src Reader(从src复制到dst,它将擦除src内容。有吗有什么方法可以避免擦除?

io.Copy(fileTo, file)将擦除文件内容

不会的。但它将把读取位置移动到EOF,这意味着下一个ioutil.ReadAll()将从…开始。。。EOF

您可以在ioutil.ReadAll()之前关闭它并重新打开"file"。

顺便说一下,您有两个defer file.Close()实例:第二个实例应该是defer fileTo.Close()
或者,更简单的是,按照PeterSO的回答,用SectionReader.Seek()重置它。

 _, err = file.Seek(0, io.SeekStart)

它也在GoByExamples Reading Files中进行了说明:

没有内置的倒带,但Seek(0, 0)可以实现这一点。

(os.SEEK_SET在os常量中定义为0(

const SEEK_SET int = 0 // seek relative to the origin of the file

现在(2020(已弃用,取而代之的是io.SeekStart
另见";Golang,一个适当的方式倒带文件指针";。

使用查找从文件结尾重置到文件开头。例如

package main
import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
)
func main() {
    file, err := os.Open("HelloWorld")
    if err != nil {
        fmt.Println(err)
    }
    defer file.Close()
    fileTo, err := os.Create("fileTo")
    if err != nil {
        fmt.Println(err)
    }
    defer fileTo.Close()
    _, err = io.Copy(fileTo, file)
    if err != nil {
        fmt.Println(err)
    }
    _, err = file.Seek(0, os.SEEK_SET) // start of file
    if err != nil {
        fmt.Println(err)
    }
    fileByteOne, err := ioutil.ReadAll(file)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(fileByteOne)
}

输出:

[72 101 108 108 111 44 32 87 111 114 108 100 33 10]

最新更新