2013-10-05 12 views
7

Voglio utilizzare andare a leggere un pezzo da un file, trattarlo come un string e gzip questo pezzo. Io so come leggere dal file e trattarlo come un string, ma quando si tratta di "compress/gzip" sono perduto. Devo creare un io.writer, che scrivere ad un (fetta byte) buf, utilizzare il gzip.Writer(io.writer) per ottenere un puntatore scrittore alla io.writer ..e quindi utilizzare gzip.Write(chunk_of_file) a scrivere il chunk_of_file a buf? quindi avrei bisogno di trattare la stringa come una fetta di byte ..come posso usare gzip su una stringa in golang?

+0

possibile duplicato di [Come utilizzare il pacchetto "compress/gzip" di golang per gzipare un file?] (Http://stackoverflow.com/questions/16890648/how-can-i-use-golangs-compress-gzip -package-to-gzip-a-file) –

+0

sono confuso dalla tua domanda, in Go una stringa * è * un byte [] quindi se si vuole che sia uno, basta convertirlo come tale [] byte (mystringvar) – mzimmerman

risposta

16

È possibile scrivere utilizzando gzip.Writer come implementa io.Writer.

Esempio:

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

Se si desidera impostare il livello di compressione (di default è "-1" from compress/flate) è possibile utilizzare gzip.NewWriterLevel.

+0

mi sento come si deve notare che lo scrittore non sarà effettivamente scrivere i byte compressi al buffer fino 'gz.Flush()' viene chiamato. Il flush viene anche chiamato con 'gz.Close()', ma l'esempio del campo da giuoco non arriva mai così lontano. – Nenoco

+0

@Nenoco Hai ragione. Ho aggiunto la dichiarazione "Flush". – Intermernet

+1

Un'altra cosa è che Flush() scrive solo i dati _current_ al buffer. Non finisce l'intero formato GZIP. Quindi, in questo caso, è abbastanza inutile, dal momento che ciò che è scritto sull'ultima riga non è una struttura GZIP valida. Devi chiamare Close() _before_ fai qualsiasi cosa con il buffer. –

Problemi correlati