Golang에서 파일을 압축 및 압축 해제하는 방법

Golang에서 파일을 압축 및 압축 해제하는 방법

Gzip 및 Zlib 알고리즘은 파일 압축 및 압축 해제에 널리 사용됩니다. Gzip은 주로 단일 파일을 압축하는 데 사용되는 반면 Zlib는 주로 데이터 스트림을 압축합니다. 알고리즘은 압축을 위해 Deflate Compression Algorithm을 사용하지만 Gzip은 오류 검사 및 파일 메타데이터를 포함한 추가 기능을 제공합니다.

Gzip은 Zlib보다 더 나은 압축률을 제공합니다. 그러나 Gzip은 데이터를 압축하고 압축 해제하기 위해 더 많은 처리 능력이 필요합니다. 대부분의 경우 파일 압축에는 Gzip을 사용하고 데이터 스트림 압축에는 Zlib를 사용해야 합니다.

Go는 압축 패키지를 통한 파일을 포함하여 데이터를 압축하는 기능을 제공합니다.

압축 패키지

압축 패키지의 내용

compress 패키지 는 다른 기능 중에서 compress/gzipcompress/zlib 패키지 를 통한 데이터 압축을 지원 합니다.

gzip 패키지는 RFC 1952 에 지정된 읽기 및 쓰기 작업을 포함하여 gzip 파일 형식 데이터 의 압축 및 압축 해제를 지원합니다 . zlib 패키지 는 zlib 형식의 데이터를 압축 및 압축 해제하는 데 도움이 됩니다.

import 키워드 를 사용하여 compress 패키지 에서 gzipzlib 를 가져올 수 있습니다 .

import (
    "compress/gzip" // import gzip

    "compress/zlib" // import zlib
)

Gzip으로 파일 압축 및 압축 해제

Gzip은 파일 압축 및 압축 해제를 위한 파일 형식 및 소프트웨어 응용 프로그램입니다. Gzip은 Lempel-Ziv-Markov 체인 알고리즘(LZ77)을 사용하여 데이터를 압축하는데, 이 알고리즘은 HTML, CSS 또는 JavaScript 파일과 같은 텍스트 파일을 압축하는 데 자주 사용됩니다.

gzip 패키지로 파일을 압축하는 과정 은 간단하고 직관적입니다. 쓰기 프로세스가 완료되었는지 확인하는 플러시 작업 전에 파일을 열고, gzip 파일을 만들고, gzip 작성기를 만들고, 원본 파일의 내용을 gzip 작성기에 복사해야 합니다.

Unix 시스템의 작업 디렉토리 터미널에서 이 bash 명령을 실행하여 샘플 텍스트 파일을 만든 다음 파일에 텍스트를 삽입합니다.

// creates a text file.
touch example.txt

// pipes the string to the file
echo 'Hello, world!' > example.txt}

파일을 만들고 텍스트를 삽입한 후 압축 작업을 위해 gzip , ioos 패키지를 가져올 수 있습니다.

compress/gzip 패키지를 사용하여 텍스트 파일을 압축하는 방법은 다음과 같습니다 .

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()
}

os 패키지 의 Open 함수는 텍스트 파일을 열고 Close 함수는 defer 문으로 파일을 닫습니다. Create 기능 은 gzip 파일을 생성하고 , gzip 패키지의 NewWriter 기능은 io 패키지 의 Copy 기능을 이용하여 텍스트 파일의 내용을 gzip 파일에 씁니다 .

gzipWriter 인스턴스 의 Flush 메서드는 압축 파일에서 모든 데이터를 사용할 수 있게 되면 gzip 작성기를 플러시합니다.

압축 해제 프로세스를 통해 gzip으로 압축된 파일에서 원본 파일을 검색할 수 있습니다. 파일 압축 해제 과정은 비슷합니다. 파일을 열고 gzip 파일 판독기를 만든 다음 내용을 새 파일에 복사하기 전에 압축되지 않은 데이터를 보관할 새 파일을 만듭니다.

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)
    }
}

os 패키지 의 Open 기능은 gzip 파일을 열고 gzip 패키지의 NewReader 기능은 압축 파일을 읽습니다. os 패키지 의 Create 기능은 새 텍스트 파일을 만듭니다. 복사 기능은 gzipReader의 내용을 uncompressedFile 복사 합니다 .

Zlib로 데이터 압축 및 압축 해제

Zlib는 데이터 압축 및 압축 해제를 위한 라이브러리입니다. 라이브러리는 또한 LZ77 알고리즘을 사용합니다. Zlib는 C로 작성되었으며 다른 압축 라이브러리 및 소프트웨어의 기반으로 널리 사용됩니다. gzip 과 달리 zlib 는 라이브러리이며 zlib 에는 파일 형식이 포함되어 있지 않습니다. 그러나 PNG 또는 HTTP와 같은 컨테이너 형식으로 저장된 데이터를 압축하는 데 자주 사용됩니다.

zlib로 압축하는 과정은 gzip과 동일합니다. zlib 파일을 만들고 작성기를 구성하고 원본 파일을 열고 콘텐츠를 압축 파일에 복사합니다.

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)
}

Create 메서드 는 zlib 파일을 만들고 NewWriterLevel 함수는 지정된 옵션(이 경우 BestCompression 옵션)을 사용하여 파일에 대한 작성기를 만듭니다. os 패키지 의 Open 메소드는 텍스트 파일을 열고 io 패키지의 Copy 기능은 압축 과정에서 텍스트 파일의 내용을 zlib 파일에 복사합니다.

zlib 파일의 압축을 풀려면 압축된 파일을 열고 새 zlib 판독기를 만든 다음 마지막으로 판독기의 내용을 표준 출력에 복사해야 합니다.

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)
}

main 함수는 os 패키지의 Open 함수 로 zlib 파일을 열고, zlib 패키지의 NewReader 함수는 zlib 파일을 리더 인스턴스로 읽어들입니다. io 패키지 의 Copy 메서드는 판독기에서 표준 출력(이 경우 콘솔)으로 콘텐츠를 복사합니다.

압축 파일의 텍스트 출력

파일 압축에 이 도구 사용

파일 압축용 코드를 작성하면 작업을 자동화하고 여러 파일을 압축하는 데 편리합니다. 몇 개의 파일만 압축해야 하는 경우 WinRar, WinZip, Express Zip 및 Bandizip과 같은 응용 프로그램을 사용할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다