Jak kompresować i dekompresować pliki w Golang

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

zawartość pakietu 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ę).

wyjście tekstu w skompresowanym pliku

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

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *