Golang でファイルを圧縮および解凍する方法

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}

ファイルを作成してテキストを挿入したら、圧縮操作のためにgzipio 、および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関数はzip されたファイルを読み取ります。osパッケージのCreate関数は、新しいテキスト ファイルを作成します。Copy関数は、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 などのアプリケーションを使用できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です