如何读取刚刚写入临时文件的数据
问题概述
尝试时在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中文网其他相关文章!