Тип gzip.Writer
Тип gzip.Writer из пакета compress/gzip реализует
запись данных в формате GZIP. Он принимает данные в несжатом виде,
сжимает их с использованием алгоритма DEFLATE и записывает в
нижележащий io.Writer. При создании нового writer можно
указать уровень сжатия от NoCompression до
BestCompression. Writer также позволяет устанавливать
метаданные, такие как имя файла и время модификации.
Синтаксис
type Writer struct {
Header
// содержит скрытые или неэкспортируемые поля
}
Создание Writer
Для создания нового gzip.Writer используйте функцию
gzip.NewWriter, которая принимает нижележащий
io.Writer и возвращает указатель на gzip.Writer
с уровнем сжатия по умолчанию:
package main
import (
"compress/gzip"
"os"
)
func main() {
file, _ := os.Create("data.gz")
writer := gzip.NewWriter(file)
defer writer.Close()
}
Метод Write
Метод Write записывает несжатые данные в writer,
которые затем сжимаются и записываются в нижележащий поток.
Он возвращает количество записанных байтов и ошибку:
package 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)
}
Результат выполнения кода:
"Bytes written: 13"
Метод Close
Метод Close завершает запись, записывая все буферизированные
данные и закрывая поток GZIP. Важно всегда вызывать этот метод,
чтобы убедиться, что все данные были корректно записаны и
заголовок GZIP был завершен:
package 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, такие как имя файла и время модификации:
package 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:
package 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 потока