Golang:为什么 compress/gzip Read 函数不读取文件内容?

Golang: Why does the compress/gzip Read function not read file contents?

我制作了一个文本文件,然后用 gzip 压缩了它。然后我 运行 下面的 go 程序来读取那个压缩文件的内容。

package main

import (
    "compress/gzip"
    "fmt"
    "os"
)

func main() {
    handle, err := os.Open("zipfile.gz")
    if err != nil {
        fmt.Println("[ERROR] File Open:", err)
    }
    defer handle.Close()

    zipReader, err := gzip.NewReader(handle)
    if err != nil {
        fmt.Println("[ERROR] New gzip reader:", err)
    }
    defer zipReader.Close()

    var fileContents []byte
    bytesRead, err := zipReader.Read(fileContents)
    if err != nil {
        fmt.Println("[ERROR] Reading gzip file:", err)
    }
    fmt.Println("[INFO] Number of bytes read from the file:", bytesRead)
    fmt.Printf("[INFO] Uncompressed contents: '%s'\n", fileContents)
}

我得到的回复如下:

$ go run zipRead.go
[INFO] Number of bytes read from the file: 0
[INFO] Uncompressed contents: ''

为什么我没有从文件中获取任何内容?

我已经在 OS X 和 Ubuntu 上创建了 zip 文件。我在 OS X 和 Ubuntu 上构建了这个 go 程序,结果相同。

io.Reader.Read 最多只能读取 len(b) 个字节。因为你的fileContents是nil,它的长度是0。分配一些space让它读入:

fileContents := make([]byte, 1024) // Read by 1 KiB.
bytesRead, err := zipReader.Read(fileContents)
if err != nil {
    fmt.Println("[ERROR] Reading gzip file:", err)
}
fileContents = fileContents[:bytesRead]

如果你想读取整个文件,你必须多次使用 Read,或者使用 ioutil.ReadAll 之类的东西(这对大文件来说可能不好)。