2013-10-05 14 views
7

Ich möchte verwenden, um ein Stück aus einem file zu lesen, behandeln Sie es als string und gzip dieses Stück. Ich weiß, wie man von der file liest und es als string behandelt, aber wenn es zu "compress/gzip" kommt, bin ich verloren. Sollte ich eine io.writer erstellen, die in eine buf (Byte-Slice) schreiben, verwenden Sie die gzip.Writer(io.writer), um einen Schreibzeiger auf die io.writer .. und dann gzip.Write(chunk_of_file) zu schreiben, die chunk_of_file zu buf? dann müsste ich die Zeichenfolge als ein Byte-Slice behandeln.wie kann ich gzip auf einer string in golang verwenden?

+0

möglich Duplikat von [Wie kann ich das "compress/gzip" -Paket von golang verwenden, um eine Datei zu gzipen?] (Http://stackoverflow.com/questions/16890648/how-can-i-use-golangs-compress-gzip -package-to-gzip-a-file) –

+0

Ich bin verwirrt durch Ihre Frage, in Go eine Zeichenfolge * ist * ein [] Byte, also wenn Sie wollen, dass es eins zu sein, konvertieren Sie es als solche [] Byte (mystringvar) – mzimmerman

Antwort

16

Sie können einfach mit gzip.Writer schreiben, wie es io.Writer implementiert.

Beispiel:

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

Wenn Sie die Komprimierungsstufe einstellen möchten (Standardeinstellung ist "-1" from compress/flate) Sie gzip.NewWriterLevel verwenden können.

+0

Ich denke, es sollte beachtet werden, dass der Writer die komprimierten Bytes nicht wirklich in den Puffer schreiben wird, bis 'gz.Flush()' aufgerufen wird. Der Flush wird auch mit 'gz.Close()' aufgerufen, aber das Spielfeld-Beispiel kommt nie so weit. – Nenoco

+0

@Nenoco Du hast Recht. Ich habe die 'Flush'-Anweisung hinzugefügt. – Intermernet

+1

Eine weitere Sache ist, dass Flush() nur die _current_ Daten in den Puffer schreibt. Es schließt nicht das ganze GZIP-Format ab. In diesem Fall ist es ziemlich nutzlos, da das, was in der letzten Zeile geschrieben ist, keine gültige GZIP-Struktur ist. Sie müssen Close() aufrufen _before_ Sie alles mit dem Puffer tun. –

Verwandte Themen