我正在嘗試使用“compress/gzip”包對一段字節(jié)進(jìn)行 gzip。我正在寫入 bytes.Buffer 并且我正在寫入 45976 字節(jié),當(dāng)我嘗試使用 gzip.reader 和 reader 函數(shù)解壓縮內(nèi)容時 - 我發(fā)現(xiàn)并非所有內(nèi)容都被恢復(fù)。bytes.buffer 有一些限制嗎?這是繞過或改變它的一種方式嗎?這是我的代碼(編輯):func compress_and_uncompress() { var buf bytes.Buffer w := gzip.NewWriter(&buf) i,err := w.Write([]byte(long_string)) if(err!=nil){ log.Fatal(err) } w.Close() b2 := make([]byte, 80000) r, _ := gzip.NewReader(&buf) j, err := r.Read(b2) if(err!=nil){ log.Fatal(err) } r.Close() fmt.Println("Wrote:", i, "Read:", j)}測試的輸出(選擇字符串作為 long_string)將給出 Wrote: 45976, Read 32768
3 回答

MYYA
TA貢獻(xiàn)1868條經(jīng)驗 獲得超4個贊
使用ioutil.ReadAll。io.Reader 的合同說它不必返回所有數(shù)據(jù),并且有一個很好的理由讓它與內(nèi)部緩沖區(qū)的大小無關(guān)。 ioutil.ReadAll像 io.Reader 一樣工作,但會一直讀到 EOF。
例如(未經(jīng)測試)
import "io/ioutil"
func compress_and_uncompress() {
var buf bytes.Buffer
w := gzip.NewWriter(&buf)
i,err := w.Write([]byte(long_string))
if err!=nil {
log.Fatal(err)
}
w.Close()
r, _ := gzip.NewReader(&buf)
b2, err := ioutil.ReadAll(r)
if err!=nil {
log.Fatal(err)
}
r.Close()
fmt.Println("Wrote:", i, "Read:", len(b2))
}
- 3 回答
- 0 關(guān)注
- 276 瀏覽
添加回答
舉報
0/150
提交
取消