Тип gzip.Writer

Тип gzip.Writer из пакета compress/gzip реализует запись данных в формате GZIP. Он принимает данные в несжатом виде, сжимает их с использованием алгоритма DEFLATE и записывает в нижележащий io.Writer. При создании нового writer можно указать уровень сжатия от NoCompression до BestCompression. Writer также позволяет устанавливать метаданные, такие как имя файла и время модификации.

Синтаксис

gotype Writer struct {
  Header
  // содержит скрытые или неэкспортируемые поля
}

Создание Writer

Для создания нового gzip.Writer используйте функцию gzip.NewWriter, которая принимает нижележащий io.Writer и возвращает указатель на gzip.Writer с уровнем сжатия по умолчанию:

gopackage main

import (
  "compress/gzip"
  "os"
)

func main() {
  file, _ := os.Create("data.gz")
  writer := gzip.NewWriter(file)
  defer writer.Close()
}

Метод Write

Метод Write записывает несжатые данные в writer, которые затем сжимаются и записываются в нижележащий поток. Он возвращает количество записанных байтов и ошибку:

gopackage main

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

func main() {
  file, _ := os.Create("data.gz")
  writer := gzip.NewWriter(file)
  defer writer.Close()

  data := []byte("Hello, World!")
  n, err := writer.Write(data)
  if err != nil {
    fmt.Println("Error writing data:", err)
  }
  fmt.Println("Bytes written:", n)
}

Результат выполнения кода:

go"Bytes written: 13"

Метод Close

Метод Close завершает запись, записывая все буферизированные данные и закрывая поток GZIP. Важно всегда вызывать этот метод, чтобы убедиться, что все данные были корректно записаны и заголовок GZIP был завершен:

gopackage main

import (
  "compress/gzip"
  "os"
)

func main() {
  file, _ := os.Create("data.gz")
  writer := gzip.NewWriter(file)

  writer.Write([]byte("test data"))
  err := writer.Close()
  if err != nil {
    panic(err)
  }
}

Установка метаданных

Перед записью данных можно установить метаданные GZIP, такие как имя файла и время модификации:

gopackage main

import (
  "compress/gzip"
  "os"
  "time"
)

func main() {
  file, _ := os.Create("data.gz")
  writer := gzip.NewWriter(file)
  defer writer.Close()

  writer.Name = "example.txt"
  writer.ModTime = time.Now()
  writer.Write([]byte("compressed data"))
}

Уровень сжатия

Для задания уровня сжатия используйте функцию gzip.NewWriterLevel, которая принимает уровень сжатия от NoCompression до BestCompression:

gopackage main

import (
  "compress/gzip"
  "os"
)

func main() {
  file, _ := os.Create("data.gz")
  writer, err := gzip.NewWriterLevel(file, gzip.BestCompression)
  if err != nil {
    panic(err)
  }
  defer writer.Close()

  writer.Write([]byte("highly compressed data"))
}

Смотрите также

  • функцию gzip.NewWriter,
    которая создает новый writer со стандартным уровнем сжатия
  • функцию gzip.NewWriterLevel,
    которая создает writer с указанным уровнем сжатия
  • метод gzip.Writer.Flush,
    который принудительно сбрасывает буфер в нижележащий writer
  • метод gzip.Writer.Close,
    который завершает запись GZIP потока