Javaには圧縮・展開を行うためのDeflater,Inflaterというクラスがあります。これを使うと簡単なAPI呼び出しでバイト配列の圧縮と展開が行えます。
今更Javaの記事書いてもおもしろくないのでKotlinでやってみました。
圧縮する
// 圧縮元データ
val rawData: ByteArray = getData()
// 圧縮データを格納する配列。余裕を持った大きさで宣言する。元データより大きくはならないはずなので、元データと同じ大きさで宣言している。
val compressedData = ByteArray(rawData.size)
val compressor = Deflater()
// 入力データを設定
// compressor.reset() // 圧縮処理後にインスタンスを再利用する場合はこれを呼ぶ
compressor.setInput(rawData)
compressor.finish() // 入力データがこれ以上ないことを宣言する
// 圧縮を行う。結果はcompressedData[0]~compressedData[compressedDataLength-1]までの範囲に格納される。
val compressedDataLength = compressor.deflate(compressedData)
val result = compressedData.copyOfRange(0, compressedDataLength) // 圧縮結果の部分だけを取り出す
展開する
// 圧縮データ
val compressedData: ByteArray = getData()
// 展開データを格納する配列。圧縮データの長さからだけでは元のデータの長さを判断できないので、余裕を持った大きさで宣言している。
val originalData = ByteArray(10000)
val inflater = Inflater()
// 入力データを設定
// inflater.reset() // 展開処理後にインスタンスを再利用する場合はこれを呼ぶ
inflater.setInput(compressedData)
inflater.finish() // 入力データがこれ以上ないことを宣言する
// 展開を行う。結果はoriginalData[0]~originalData[originalDataLength-1]までの範囲に格納される。
val originalDataLength = inflater.inflate(originalData)
val result = originalData.copyOfRange(0, originalDataLength) // 展開結果の部分だけを取り出す
たとえばSocketやDatagramSocketなどでデータを送る時にこれを利用することで送信前にデータを圧縮して受信後に展開することで、通信帯域を節約することができます。