Jak kompresować i dekompresować pliki w Golang
Algorytmy Gzip i Zlib są powszechnie używane do kompresji i dekompresji plików. Gzip jest używany głównie do kompresji pojedynczych plików, podczas gdy Zlib kompresuje głównie strumienie danych. Algorytmy używają algorytmu kompresji Deflate do kompresji, chociaż Gzip zapewnia dodatkowe funkcje, w tym sprawdzanie błędów i metadane plików.
Gzip zapewnia lepsze współczynniki kompresji niż Zlib. Jednak Gzip wymaga większej mocy obliczeniowej do kompresji i dekompresji danych. W większości przypadków powinieneś używać Gzip do kompresji plików i Zlib do kompresji strumieni danych.
Go zapewnia funkcjonalność kompresji danych, w tym plików za pośrednictwem pakietu kompresji .
Pakiet kompresji
Pakiet compress obsługuje między innymi kompresowanie danych za pomocą pakietów compress/gzip i compress/zlib .
Pakiet gzip obsługuje kompresję i dekompresję danych w formacie pliku gzip, w tym operacje odczytu i zapisu, jak określono w dokumencie RFC 1952 . Podczas gdy pakiet zlib pomaga w kompresji i dekompresji danych w formacie zlib.
Możesz zaimportować gzip i zlib z pakietu compress za pomocą słowa kluczowego import .
import (
"compress/gzip" // import gzip
"compress/zlib" // import zlib
)
Kompresowanie i dekompresowanie plików za pomocą Gzip
Gzip to format pliku i aplikacja do kompresji i dekompresji plików. Gzip używa algorytmu łańcuchowego Lempel-Ziv-Markov (LZ77) do kompresji danych, a algorytm ten jest często używany do kompresji plików tekstowych, takich jak pliki HTML, CSS lub JavaScript.
Proces kompresji plików za pomocą pakietu gzip jest prosty i intuicyjny. Będziesz musiał otworzyć plik, utworzyć plik spakowany gzip, utworzyć program zapisujący gzip i skopiować zawartość oryginalnego pliku do programu zapisującego gzip przed operacją opróżniania, która zapewnia zakończenie procesu zapisu.
Uruchom to polecenie bash w terminalu katalogu roboczego w systemach Unix, aby utworzyć przykładowy plik tekstowy, a następnie wstaw tekst do pliku.
// creates a text file.
touch example.txt
// pipes the string to the file
echo 'Hello, world!' > example.txt}
Po utworzeniu pliku i wstawieniu tekstu można zaimportować pakiety gzip , io i os do operacji kompresji.
Oto jak możesz użyć pakietu compress/gzip do skompresowania pliku tekstowego.
import (
"compress/gzip"
"io"
"os"
)
func main() {
// Open the original file
originalFile, err: = os.Open("example.txt")
if err! = nil {
panic(err)
}
defer originalFile.Close()
// Create a new gzipped file
gzippedFile, err: = os.Create("example.txt.gz")
if err! = nil {
panic(err)
}
defer gzippedFile.Close()
// Create a new gzip writer
gzipWriter: = gzip.NewWriter(gzippedFile)
defer gzipWriter.Close()
// Copy the contents of the original file to the gzip writer
_, err = io.Copy(gzipWriter, originalFile)
if err! = nil {
panic(err)
}
// Flush the gzip writer to ensure all data is written
gzipWriter.Flush()
}
Funkcja Open pakietu os otwiera plik tekstowy, a funkcja Close zamyka plik za pomocą instrukcji odroczenia . Funkcja Create tworzy plik spakowany gzip, a funkcja NewWriter pakietu gzip zapisuje zawartość pliku tekstowego do pliku gzip przy użyciu funkcji Kopiuj pakietu io .
Metoda Flush instancji gzipWriter opróżnia moduł zapisujący gzip, gdy wszystkie dane w skompresowanym pliku będą dostępne.
Możesz odzyskać oryginalny plik z pliku spakowanego gzipem poprzez proces dekompresji. Proces dekompresji pliku jest podobny; otworzysz plik i utworzysz czytnik plików gzip, a następnie utworzysz nowy plik do przechowywania nieskompresowanych danych przed skopiowaniem zawartości do nowego pliku.
import (
"compress/gzip"
"io"
"os"
)
func main() {
// Open the gzipped file
gzippedFile, err: = os.Open("example.txt.gz")
if err! = nil {
panic(err)
}
defer gzippedFile.Close()
// Create a new gzip reader
gzipReader, err: = gzip.NewReader(gzippedFile)
defer gzipReader.Close()
// Create a new file to hold the uncompressed data
uncompressedFile, err: = os.Create("example.txt")
if err! = nil {
panic(err)
}
defer uncompressedFile.Close()
// Copy the contents of the gzip reader to the new file
_, err = io.Copy(uncompressedFile, gzipReader)
if err! = nil {
panic(err)
}
}
Funkcja Open pakietu os otwiera spakowany plik gzip, a funkcja NewReader pakietu gzip odczytuje spakowany plik. Funkcja Create pakietu os tworzy nowy plik tekstowy. Funkcja Copy kopiuje zawartość gzipReader do pliku uncompressedFile .
Kompresja i dekompresja danych za pomocą Zlib
Zlib to biblioteka do kompresji i dekompresji danych; biblioteka wykorzystuje również algorytm LZ77. Zlib jest napisany w C i jest szeroko stosowany jako podstawa dla innych bibliotek kompresji i oprogramowania. W przeciwieństwie do gzip , zlib jest biblioteką, a zlib nie zawiera formatu pliku. Jednak często jest używany do kompresji danych przechowywanych w formatach kontenerów, takich jak PNG lub HTTP.
Proces kompresji za pomocą zlib jest taki sam jak w przypadku gzip. Utworzysz plik zlib, skonfigurujesz program piszący, otworzysz oryginalny plik i skopiujesz zawartość do skompresowanego pliku.
import (
"compress/zlib"
"io"
"os"
)
func main() {
// Create a new file "example.zlib"
file, err: = os.Create("example.zlib")
// If error occurs, panic and stop the program
if err! = nil {
panic(err)
}
// Ensure that the file is closed after the function returns
defer file.Close()
// Create a new zlib writer with the best compression level
writer, err: = zlib.NewWriterLevel(file, zlib.BestCompression)
// If error occurs, panic and stop the program
if err! = nil {
panic(err)
}
// Ensure that the writer is closed after the function returns
defer writer.Close()
// Open the input file "example.txt"
inputFile, err: = os.Open("example.txt")
// If error occurs, panic and stop the program
if err! = nil {
panic(err)
}
// Ensure that the input file is closed after the function returns
defer inputFile.Close()
// Copy the contents of the input file to the writer
io.Copy(writer, inputFile)
}
Metoda Create tworzy plik zlib, a funkcja NewWriterLevel tworzy program piszący dla pliku z określoną opcją (w tym przypadku opcją BestCompression ). Metoda Open pakietu os otwiera plik tekstowy, a funkcja Copy pakietu io kopiuje zawartość pliku tekstowego do pliku zlib w procesie kompresji.
Aby zdekompresować plik zlib, musisz otworzyć skompresowany plik, utworzyć nowy czytnik zlib, a następnie skopiować zawartość czytnika na standardowe wyjście.
import (
"compress/zlib"
"io"
"os"
)
func main() {
// Open the compressed file "compressed_file.zlib"
file, err: = os.Open("compressed_file.zlib")
// If error occurs, panic and stop the program
if err! = nil {
panic(err)
}
// Ensure that the file is closed after the function returns
defer file.Close()
// Create a new zlib reader for the compressed file
reader, err: = zlib.NewReader(file)
// If error occurs, panic and stop the program
if err! = nil {
panic(err)
}
// Ensure that the reader is closed after the function returns
defer reader.Close()
// Copy the contents of the reader to the standard output
io.Copy(os.Stdout, reader)
}
Funkcja main otwiera plik zlib za pomocą funkcji Open pakietu os , a funkcja NewReader pakietu zlib wczytuje plik zlib do instancji czytnika. Metoda Copy pakietu io kopiuje zawartość z czytnika na standardowe wyjście (w tym przypadku konsolę).
Użyj tych narzędzi do kompresji plików
Pisanie kodu do kompresji plików jest przydatne do automatyzacji zadań i kompresji kilku plików. Jeśli potrzebujesz skompresować tylko kilka plików, możesz skorzystać z aplikacji takich jak WinRar, WinZip, Express Zip i Bandizip.
Dodaj komentarz