gpt4 book ai didi

go - 文件中的 ReadAll 未按预期工作

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:07 25 4
gpt4 key购买 nike

我正在尝试创建一个临时 gzip 文件并写入该文件。问题是我不了解 ReadAll 发生了什么。我希望 ReadAll 返回写入文件的字节......但是没有。然而 File.Stat 命令显示确实有数据。

filename := "test"
file, err := ioutil.TempFile("", filename)
if err != nil {
fmt.Println(err)
}
defer func() {
if err := os.Remove(file.Name()); err != nil {
fmt.Println(err)
}
}()

w := gzip.NewWriter(file)
_, err = w.Write([]byte("hell0"))
if err != nil {
fmt.Println(err)
}

fileInfo, err := file.Stat()
if err != nil {
fmt.Println(err)
}
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println(err)
}
if err := w.Close(); err != nil {
fmt.Println(err)
}
fmt.Println("SIZE1:", fileInfo.Size())
fmt.Println("SIZE2:", len(fileBytes))

这是 Playground 链接 https://play.golang.org/p/zX8TSCAbRL

为什么没有返回字节?如何获取返回的字节数?

最佳答案

在阅读之前关闭文件。

来自 the documentation gzip:

Write writes a compressed form of p to the underlying io.Writer. The compressed bytes are not necessarily flushed until the Writer is closed.

因此,解决方案是在尝试读取字节数之前关闭 gzip Writer 以及底层的 io.Writer。

    func main() {
basename := "test"
file, err := ioutil.TempFile("", basename)
tempFilename := file.Name()
if err != nil {
fmt.Println(err)
}
defer func() {
if err := os.Remove(file.Name()); err != nil {
fmt.Println(err)
}
}()

w := gzip.NewWriter(file)
_, err = w.Write([]byte("hell0"))
if err != nil {
fmt.Println(err)
}

w.Close()
file.Close()

file, err = os.Open(tempFilename)
fileInfo, err := file.Stat()
if err != nil {
fmt.Println(err)
}
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println(err)
}
if err := w.Close(); err != nil {
fmt.Println(err)
}
fmt.Println("SIZE1:", fileInfo.Size())
fmt.Println("SIZE2:", len(fileBytes))

}

查看Playground .

关于go - 文件中的 ReadAll 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com