Тип gzip.Reader
Тип gzip.Reader реализует интерфейс io.Reader
для чтения данных, сжатых в формате gzip. Он позволяет
распаковывать gzip-архивы и читать их содержимое.
Для создания нового читателя используется функция
gzip.NewReader, которая принимает в качестве
аргумента источник данных (например, файл или сетевой
сокет) и возвращает указатель на gzip.Reader.
Синтаксис
gzip.NewReader(r io.Reader) (*gzip.Reader, error)
Метод Read читает распакованные данные в слайс байтов:
func (z *gzip.Reader) Read(p []byte) (n int, err error)
Пример
Давайте создадим gzip-архив и прочитаем его с помощью
gzip.Reader:
package 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))
}
Результат выполнения кода:
"Hello, Gzip!"
Пример
Давайте продемонстрируем пошаговое чтение распакованных
данных из gzip-архива с использованием метода Read:
package 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
}
}
}
Результат выполнения кода:
"Прочитано 2 байт: 12"
"Прочитано 2 байт: 34"
"Прочитано 1 байт: 5"
Пример
Давайте обработаем ошибку при чтении некорректного gzip-архива:
package 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))
}
Результат выполнения кода:
"Ошибка: gzip: invalid header"
Смотрите также
-
функцию
gzip.NewReader,
которая создает новый читатель для распаковки gzip-данных -
тип
gzip.Writer,
который используется для сжатия данных в формат gzip -
метод
gzip.Reader.Close,
который закрывает читатель и освобождает ресурсы -
пакет
compress/gzip,
в котором определены все функции для работы с gzip