【java】 .NetのDeflateStreamで圧縮したデータをjavaで解凍する


こちらの「DeflateStream」で圧縮を行う
http://msdn.microsoft.com/ja-jp/library/system.io.compression.deflatestream(v=vs.110).aspx

「java.util.zip.InflaterInputStream」を使用して解凍を行うと
java.util.zip.DataFormatException: unknown compression method」となってしまいました。

試したのは下記サイトにある「Java Decompression:」です。
http://www.dreamincode.net/forums/topic/243808-compression-and-decompression-between-java-and-c%23/

どうやら圧縮したときのアルゴリズムと解凍するときのアルゴリズムが違うようです。
下記URLを参考にするとRFC1951で統一しないといけないようです。
http://social.msdn.microsoft.com/Forums/vstudio/ja-JP/a50c2e61-f7c9-4869-9ce2-f69a705d28a7/systemiocompressiondeflatestream?forum=vsgeneralja

んで、どうやって「java.util.zip.InflaterInputStream」のアルゴリズムを変えるか調べたら
こんなやりとりを発見。
http://stackoverflow.com/questions/3932117/handling-http-contentencoding-deflate

「InflaterInputStream」にて「new Inflater(true)」を設定するといけるそうな。

InflaterInputStream inflater = new InflaterInputStream(compressedStream);
↓
InflaterInputStream inflater = new InflaterInputStream(compressedStream, new Inflater(true));

最終的にはこんな感じで書いたらいけました。

private byte[] inflaterDecompress(byte[] toDecompress)
{
	try
	{
	    ByteArrayOutputStream uncompressedStream = new ByteArrayOutputStream();
	    ByteArrayInputStream compressedStream = new ByteArrayInputStream(toDecompress);
	    InflaterInputStream inflater = new InflaterInputStream(compressedStream, new Inflater(true));

	    int c;
	    while ((c = inflater.read()) != -1)
	    {
			uncompressedStream.write(c);
	    }
	    return uncompressedStream.toByteArray();
	}
	catch (Exception e)
	{
	    e.printStackTrace();
		return null;
	}
}

コメントを残す

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