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
之类的东西(这对大文件来说可能不好)。
我制作了一个文本文件,然后用 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
之类的东西(这对大文件来说可能不好)。