我创建了一个文本文件,然后使用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
程序,结果相同。
答案 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
之类的内容(这可能对大文件不利)。