2012-05-13 6 views
10

私はおおよそ10K文字の文字列をいくつか持っています。それらにはたくさんの繰り返しがあります。それらはシリアル化されたJSONオブジェクトです。私は簡単にそれらをバイト配列に圧縮し、バイト配列から解凍したいと思います。文字列をバイト配列との間で簡単に圧縮および解凍する方法はありますか?

どのようにすれば最も簡単に行うことができますか?私は次の操作を行うことができますので、私は方法を探しています:

String original = "....long string here with 10K characters..."; 
byte[] compressed = StringCompressor.compress(original); 
String decompressed = StringCompressor.decompress(compressed); 
assert(original.equals(decompressed); 
+1

ByteArrayInput/OutputStreamでInflatorInputStream/DeflatorOutputStreamを使用します。 –

+2

使いやすい 'zip'クラスがあります。編集 - ここにはhttp://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summaryがあります。 htmlと@ peterのクラスを使用しているようです。 –

+2

これはいかがですか? http://stackoverflow.com/questions/3649485/how-to-compress-a-string –

答えて

23

あなたが試すことができ

enum StringCompressor { 
    ; 
    public static byte[] compress(String text) { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 
      OutputStream out = new DeflaterOutputStream(baos); 
      out.write(text.getBytes("UTF-8")); 
      out.close(); 
     } catch (IOException e) { 
      throw new AssertionError(e); 
     } 
     return baos.toByteArray(); 
    } 

    public static String decompress(byte[] bytes) { 
     InputStream in = new InflaterInputStream(new ByteArrayInputStream(bytes)); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 
      byte[] buffer = new byte[8192]; 
      int len; 
      while((len = in.read(buffer))>0) 
       baos.write(buffer, 0, len); 
      return new String(baos.toByteArray(), "UTF-8"); 
     } catch (IOException e) { 
      throw new AssertionError(e); 
     } 
    } 
} 
+2

こんにちは、なぜここで 'class'の代わりに' enum'を使用しますか?それはポイントを証明することですか? –

+6

シングルトンや静的専用クラスを実装する方法として、enumクラスを使用する人がいます。有効なJavaの作家であるJoshua Blochが推薦します。 –

+0

このクラスのインスタンスは許可されていません。 –

2

ピーターLawreyの答えは、解凍機能

のために、このあまり複雑なコードを使用してビットを改善することができます
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     OutputStream out = new InflaterOutputStream(baos); 
     out.write(bytes); 
     out.close(); 
     return new String(baos.toByteArray(), "UTF-8"); 
    } catch (IOException e) { 
     throw new AssertionError(e); 
    } 
0

私は一般的な文字列を圧縮する問題を解決するためにライブラリを作った(特に短いもの)。 さまざまなアルゴリズム(普通のutf-8、ラテン文字用の5bitエンコーディング、長い文字列用のhuffmanエンコーディング、gzip)を使用してストリングを圧縮しようとします。最悪の結果を持つものを選択します(最悪の場合、utf- 8エンコーディングで、スペースを失うことはありません)。私はそれが有用である可能性を期待

は、ここにリンクが https://github.com/lithedream/lithestring

EDIT:私は、あなたの文字列は常に「長い」していることに気づき、それらのサイズのためにgzipのマイライブラリのデフォルト、私はあなたのためのより良い行うことができない恐れ。

関連する問題