首頁 >後端開發 >Golang >為什麼在 Go 中無法讀取剛寫入暫存檔案的資料?

為什麼在 Go 中無法讀取剛寫入暫存檔案的資料?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-30 04:30:16824瀏覽

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