2008.09.21

Ruby Rails

JavaのZipOutputStreamとRubyのZlib::Deflateの使い方

いまやってる仕事で、JavaのZipOutputStreamを使ってテキストデータを圧縮するというコードを書いているのですが、こいつがなかなか手強いです。

Web上のサンプルコードはほとんどが圧縮ファイルを吐き出すものなのですが、今回の場合はファイルではなく圧縮データだけが欲しいのです。

Webのサンプルを寄せ集めて以下のようなコードを書いたのですが、textは直接圧縮できる程度のデータ量なのでStreamを経由させなくていいはずだし、ZipEntryで "zipped_entry" というファイル名(?)を与えてるのも気持ち悪いです。もっとスマートに書けなる気がしてしょうがない。。

ByteArrayOutputStream byte_out = new ByteArrayOutputStream();
ZipOutputStream zip_out = new ZipOutputStream(byte_out);
zip_out.putNextEntry(new ZipEntry("zipped_entry"));
zip_out.write(text.getBytes(), 0, text.getBytes().length);
zip_out.closeEntry();
zip_out.close();
String zipped_text = byte_out.toString();

Rubyだと1行で書けます。(Stream的なのを使おうとすれば別)

zipped_text = Zlib::Deflate.deflate(text)

以下のようにStringクラスにメソッドを追加すれば

class String
  def zipped
    require 'zlib'
    Zlib::Deflate.deflate(self)
  end
end

こんなに気持よく書けるようになります。

text.zipped

この差は言語の差なのか、僕がJava分かってなさすぎなだけなのか、どっちなんでしょう?

教えて、Javaの人!