2012-05-13 9 views
10

Her biri yaklaşık 10K karakter olan bazı dizelerim var. İçlerinde bolca tekrar var. JSON nesnelerini serileştirdiler. Bunları bir bayt dizisine kolayca sıkıştırmak ve bunları bir bayt dizisinden açmak istiyorum.Dizeleri/dizelerinden bayt dizilerine nasıl kolayca sıkıştırıp açabilirim?

Bunu en kolay nasıl yapabilirim? Ben aşağıdakileri yapabilirsiniz yüzden yöntemlerle arıyorum:

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

InflatorInputStream/DeflatorOutputStream öğesini ByteArrayInput/OutputStream ile kullanırım. –

+2

Kullanımı kolay bir 'zip' sınıfı var ... düzenle - burası http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary. html ve belirtilen sınıfları @peter görünüyor. –

+2

Bu nasıl? http://stackoverflow.com/questions/3649485/how-to-compress-a-string –

cevap

23

Deneyebilirsin

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

Merhaba, neden 'class' yerine' enum 'kullanıyorsunuz? Bir nokta kanıtlamak mı? –

+6

Bazı kişiler, enton sınıflarını, tekil veya yalnızca statik sınıfları uygulamak için bir yol olarak kullanmayı sever. Etkin Java'nın yazarı Joshua Bloch tarafından önerildi. –

+0

Bu sınıfın izin verilen örnekleri yoktur. –

2

Peter Lawrey cevabı decompress fonksiyonu

için bu daha az karmaşık kodu kullanarak biraz geliştirilebilir
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

Genel Dizeleri (özellikle kısa olanları) sıkıştırma sorunu çözmek için bir kitaplık yaptım. Çeşitli algoritmalar kullanarak String'i sıkıştırmaya çalışır (düz utf-8, latin harfler için 5bit kodlama, huffman kodlaması, uzun Strings için gzip) ve en kısa sonuca sahip olanı seçer (en kötü durumda utf- 8 kodlama, böylece alanı kaybetme riski yoktur). Bunun yararlı olabilir umut

, burada bağlantıyı https://github.com/lithedream/lithestring

DÜZENLEME: Ben senin Strings bu boyutlarla ilgili gzip benim kütüphane varsayılan, ben sizin için daha iyi yapamaz korku, her zaman "uzun" olduğunu fark .

İlgili konular