如何讀取剛剛寫入臨時文件的數據
問題概述
嘗試時在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中文網其他相關文章!