dongshi9526 2015-08-14 20:26
浏览 213
已采纳

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

I made a text file, that I then compressed with gzip. I then run the following go program to read the contents of that compressed file.

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'
", fileContents)
}

The response that I get is the following:

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

Why am I not getting any contents from the file?

I have created zip files on both OS X and Ubuntu. I have build this go program on both OS X and Ubuntu with the same result.

  • 写回答

1条回答 默认 最新

  • donglu1881 2015-08-14 21:00
    关注

    io.Reader.Read will only read up to len(b) bytes. Since your fileContents is nil, its length is 0. Allocate some space for it to read into:

    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]
    

    If you want to read the whole file, you'll have to either use Read several times, or use things like ioutil.ReadAll (which may be bad for big files).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器