Тип gzip.Reader

Тип gzip.Reader реализует интерфейс io.Reader для чтения данных, сжатых в формате gzip. Он позволяет распаковывать gzip-архивы и читать их содержимое. Для создания нового читателя используется функция gzip.NewReader, которая принимает в качестве аргумента источник данных (например, файл или сетевой сокет) и возвращает указатель на gzip.Reader.

Синтаксис

gogzip.NewReader(r io.Reader) (*gzip.Reader, error)

Метод Read читает распакованные данные в слайс байтов:

gofunc (z *gzip.Reader) Read(p []byte) (n int, err error)

Пример

Давайте создадим gzip-архив и прочитаем его с помощью gzip.Reader:

gopackage main

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

func main() {
  // Создаем буфер и gzip-писатель
  var buf bytes.Buffer
  writer := gzip.NewWriter(&buf)

  // Записываем сжатые данные
  data := []byte("Hello, Gzip!")
  _, err := writer.Write(data)
  if err != nil {
    fmt.Println("Ошибка записи:", err)
    return
  }
  err = writer.Close()
  if err != nil {
    fmt.Println("Ошибка закрытия:", err)
    return
  }

  // Создаем gzip-читатель для распаковки
  reader, err := gzip.NewReader(&buf)
  if err != nil {
    fmt.Println("Ошибка создания читателя:", err)
    return
  }
  defer reader.Close()

  // Читаем распакованные данные
  result, err := io.ReadAll(reader)
  if err != nil {
    fmt.Println("Ошибка чтения:", err)
    return
  }
  fmt.Println(string(result))
}

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

go"Hello, Gzip!"

Пример

Давайте продемонстрируем пошаговое чтение распакованных данных из gzip-архива с использованием метода Read:

gopackage main

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

func main() {
  // Подготавливаем сжатые данные
  var buf bytes.Buffer
  writer := gzip.NewWriter(&buf)

  compressedData := []byte("12345")
  _, err := writer.Write(compressedData)
  if err != nil {
    fmt.Println("Ошибка записи:", err)
    return
  }
  err = writer.Close()
  if err != nil {
    fmt.Println("Ошибка закрытия:", err)
    return
  }

  // Создаем gzip-читатель
  reader, err := gzip.NewReader(&buf)
  if err != nil {
    fmt.Println("Ошибка создания читателя:", err)
    return
  }
  defer reader.Close()

  // Читаем данные по частям
  chunk := make([]byte, 2)
  for {
    n, err := reader.Read(chunk)
    if n > 0 {
      fmt.Printf("Прочитано %d байт: %s\n", n, string(chunk[:n]))
    }
    if err != nil {
      break
    }
  }
}

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

go"Прочитано 2 байт: 12"
"Прочитано 2 байт: 34"
"Прочитано 1 байт: 5"

Пример

Давайте обработаем ошибку при чтении некорректного gzip-архива:

gopackage main

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

func main() {
  // Некорректные gzip-данные
  invalidData := []byte("not a gzip data")
  buf := bytes.NewReader(invalidData)

  // Пытаемся создать gzip-читатель
  reader, err := gzip.NewReader(buf)
  if err != nil {
    fmt.Println("Ошибка:", err)
    return
  }
  defer reader.Close()

  // Пытаемся прочитать данные
  result, err := io.ReadAll(reader)
  if err != nil {
    fmt.Println("Ошибка чтения:", err)
    return
  }
  fmt.Println(string(result))
}

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

go"Ошибка: gzip: invalid header"

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

  • функцию gzip.NewReader,
    которая создает новый читатель для распаковки gzip-данных
  • тип gzip.Writer,
    который используется для сжатия данных в формат gzip
  • метод gzip.Reader.Close,
    который закрывает читатель и освобождает ресурсы
  • пакет compress/gzip,
    в котором определены все функции для работы с gzip