2013-10-05 16 views
7

Tôi muốn sử dụng để đọc một đoạn từ file, coi nó là stringgzip đoạn này. Tôi biết cách đọc từ số file và coi nó là string, nhưng khi nói đến "compress/gzip" Tôi bị mất. Tôi có nên tạo một io.writer, ghi vào buf (lát byte), sử dụng gzip.Writer(io.writer) để lấy con trỏ của nhà văn đến io.writer .. và sau đó sử dụng gzip.Write(chunk_of_file) để viết chunk_of_file đến buf? sau đó tôi sẽ cần xử lý chuỗi dưới dạng một lát byte ..làm cách nào tôi có thể sử dụng gzip trên một chuỗi trong golang?

+0

bản sao có thể có của [Làm cách nào tôi có thể sử dụng gói "nén/gzip" của golang để gzip một tệp?] (Http://stackoverflow.com/questions/16890648/how-can-i-use-golangs-compress-gzip -package-to-gzip-a-file) –

+0

Tôi đang bối rối bởi câu hỏi của bạn, trong Go a string * là * a [] byte vì vậy nếu bạn muốn nó là một, chỉ cần chuyển đổi nó như vậy [] byte (mystringvar) – mzimmerman

Trả lời

16

Bạn chỉ có thể viết bằng cách sử dụng gzip.Writer khi nó triển khai io.Writer.

Ví dụ:

package main 

import (
    "bytes" 
    "compress/gzip" 
    "fmt" 
) 

func main() { 
    var b bytes.Buffer 
    gz := gzip.NewWriter(&b) 
    if _, err := gz.Write([]byte("YourDataHere")); err != nil { 
     panic(err) 
    } 
    if err := gz.Flush(); err != nil { 
     panic(err) 
    } 
    if err := gz.Close(); err != nil { 
     panic(err) 
    } 
    fmt.Println(b) 
} 

Playground

Nếu bạn muốn thiết lập mức độ nén (mặc định là "-1" from compress/flate), bạn có thể sử dụng gzip.NewWriterLevel.

+0

Tôi cảm thấy cần lưu ý rằng Writer sẽ không thực sự ghi các byte đã nén vào bộ đệm cho đến khi 'gz.Flush()' được gọi. Tuôn ra cũng được gọi với 'gz.Close()', nhưng ví dụ sân chơi không bao giờ đạt được điều đó. – Nenoco

+0

@Nenoco Bạn nói đúng. Tôi đã thêm câu lệnh 'Flush'. – Intermernet

+1

Một điều nữa là Flush() chỉ ghi dữ liệu _current_ vào bộ đệm. Nó không hoàn thành toàn bộ định dạng GZIP. Vì vậy, trong trường hợp này, nó khá vô dụng, vì những gì được viết trên dòng cuối cùng không phải là một cấu trúc GZIP hợp lệ. Bạn cần phải gọi Close() _before_ bạn làm bất cứ điều gì với bộ đệm. –

Các vấn đề liên quan