2012-05-13 17 views
10

Tengo algunas cadenas que son aproximadamente 10K caracteres cada una. Hay mucha repetición en ellos. Son objetos JSON serializados. Me gustaría comprimirlos fácilmente en una matriz de bytes y descomprimirlos a partir de una matriz de bytes.¿Cómo puedo comprimir y descomprimir fácilmente cadenas a/desde matrices de bytes?

¿Cómo puedo hacer esto más fácilmente? Estoy buscando métodos para que pueda hacer lo siguiente:

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

Usaría InflatorInputStream/DeflatorOutputStream con ByteArrayInput/OutputStream. –

+2

Hay una clase 'zip' fácil de usar por ahí ... editar - está aquí http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary. html y parece usar las clases @peter mencionadas. –

+2

¿Qué tal esto? http://stackoverflow.com/questions/3649485/how-to-compress-a-string –

Respuesta

23

Usted puede intentar

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

Hola, ¿por qué usas 'enum' en lugar de' clase' aquí? ¿Es para demostrar un punto? –

+6

A algunas personas les gusta usar clases enum como una forma de implementar clases únicas o estáticas. Recomendado por Joshua Bloch, escritor de Effective Java. –

+0

Es decir que no se permiten instancias de esta clase. –

2

respuesta de Pedro Lawrey se puede mejorar un poco el uso de este código sea menos compleja para la función de descomprimir

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

Hice una biblioteca para resolver el problema de comprimir cadenas genéricas (especialmente las cortas). Trata de comprimir el String usando varios algoritmos (utf-8 simple, codificación de 5 bits para letras latinas, codificación huffman, gzip para cadenas largas) y elige el que tenga el resultado más corto (en el peor de los casos, elegirá el utf- 8 codificación, para que nunca se arriesgue a perder espacio).

espero que puede ser útil, aquí está el enlace https://github.com/lithedream/lithestring

EDIT: me di cuenta de que sus cadenas son siempre "largo", mis opciones de la biblioteca en gzip para esos tamaños, me temo que no puedo hacer mejor para usted .

Cuestiones relacionadas