首页 >后端开发 >Golang >为什么在 Go 中无法读取刚写入临时文件的数据?

为什么在 Go 中无法读取刚写入临时文件的数据?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-30 04:30:16764浏览

Why Can't I Read Data I Just Wrote to a Temporary File in Go?

如何读取刚刚写入临时文件的数据

问题概述

尝试时在Go中将数据写入临时文件然后读取它,用户可能会遇到困难。尽管成功地将数据写入文件,但随后检索数据却很难。

解决方案

问题的关键在于 ioutil.TempFile 的操作方式。此函数创建一个临时文件并打开它以进行读取和写入。因此,在写入操作后,文件内的指针位于数据的末尾。

要解决此挑战,有必要在尝试之前使用 *os.File.Seek 查找文件的开头从中读取。此操作将指针重置为开始,使后续的读取操作能够访问写入的数据。

实现

以下代码示例演示了正确的实现:

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0])))
    if err != nil {
        log.Fatal("Could not create temporary file", err)
    }
    defer tmpFile.Close()

    fmt.Println("Created temp file: ", tmpFile.Name())

    fmt.Println("Writing some data to the temp file")
    if _, err = tmpFile.WriteString("test data"); err != nil {
        log.Fatal("Unable to write to temporary file", err)
    } else {
        fmt.Println("Data should have been written")
    }

    fmt.Println("Trying to read the temp file now")

    // Seek the pointer to the beginning
    tmpFile.Seek(0, 0)
    s := bufio.NewScanner(tmpFile)
    for s.Scan() {
        fmt.Println(s.Text())
    }
    if err = s.Err(); err != nil {
        log.Fatal("error reading temp file", err)
    }
}

优化性能

为了在上述解决方案中获得最佳性能,请考虑使用 bytes.Buffer 而不是临时文件。该缓冲区可以传递给 bufio.Reader 以便于读取数据。

此外,s.Scan() 循环可以替换为 ioutil.ReadAll() 以便高效地将所有数据读取到一个字节中切片。

以上是为什么在 Go 中无法读取刚写入临时文件的数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn