Golang에서 파일을 압축 및 압축 해제하는 방법
Gzip 및 Zlib 알고리즘은 파일 압축 및 압축 해제에 널리 사용됩니다. Gzip은 주로 단일 파일을 압축하는 데 사용되는 반면 Zlib는 주로 데이터 스트림을 압축합니다. 알고리즘은 압축을 위해 Deflate Compression Algorithm을 사용하지만 Gzip은 오류 검사 및 파일 메타데이터를 포함한 추가 기능을 제공합니다.
Gzip은 Zlib보다 더 나은 압축률을 제공합니다. 그러나 Gzip은 데이터를 압축하고 압축 해제하기 위해 더 많은 처리 능력이 필요합니다. 대부분의 경우 파일 압축에는 Gzip을 사용하고 데이터 스트림 압축에는 Zlib를 사용해야 합니다.
Go는 압축 패키지를 통한 파일을 포함하여 데이터를 압축하는 기능을 제공합니다.
압축 패키지
compress 패키지 는 다른 기능 중에서 compress/gzip 및 compress/zlib 패키지 를 통한 데이터 압축을 지원 합니다.
gzip 패키지는 RFC 1952 에 지정된 읽기 및 쓰기 작업을 포함하여 gzip 파일 형식 데이터 의 압축 및 압축 해제를 지원합니다 . zlib 패키지 는 zlib 형식의 데이터를 압축 및 압축 해제하는 데 도움이 됩니다.
import 키워드 를 사용하여 compress 패키지 에서 gzip 및 zlib 를 가져올 수 있습니다 .
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 , io 및 os 패키지를 가져올 수 있습니다.
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과 같은 응용 프로그램을 사용할 수 있습니다.
답글 남기기