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

时间:2015-08-14 20:26:10

标签: file-io go gzip

我创建了一个文本文件,然后使用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程序,结果相同。

1 个答案:

答案 0 :(得分:3)

io.Reader.Read只会读取len(b)个字节。由于您的fileContents为零,因此其长度为0.为其分配一些空间以供阅读:

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之类的内容(这可能对大文件不利)。