2012-05-13 10 views
10

मेरे पास कुछ तार हैं जो लगभग 10K वर्ण हैं। उनमें बहुत बार दोहराव है। वे JSON ऑब्जेक्ट्स serialized हैं। मैं उन्हें बाइट सरणी में आसानी से संपीड़ित करना चाहता हूं, और उन्हें बाइट सरणी से असम्पीडित करना चाहता हूं।बाइट एरेज़ से/से स्ट्रिंग्स को आसानी से कैसे संकुचित और डिकंप्रेस कर सकते हैं?

मैं इसे आसानी से कैसे कर सकता हूं? मैं तरीकों की तलाश में हूँ तो मैं क्या कर सकते हैं निम्नलिखित:

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

मैं ByteArrayInput/आउटपुटस्ट्रीम के साथ InflatorInputStream/DeflatorOutputStream का उपयोग करूंगा। –

+2

वहां उपयोग में आसान 'ज़िप' कक्षा है ... संपादित करें - यह यहां है http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary। एचटीएमएल और वर्ग @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

हैलो, आप यहाँ 'कक्षा' के बजाय 'enum' का उपयोग क्यों करते हैं? क्या यह एक बिंदु साबित करना है? –

+6

कुछ लोग सिंगल कक्षाओं को सिंगलेट या स्थिर-केवल कक्षाओं को लागू करने के तरीके के रूप में उपयोग करना पसंद करते हैं। प्रभावशाली जावा के लेखक जोशुआ ब्लोच द्वारा अनुशंसित। –

+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, लैटिन अक्षरों के लिए 5 बिट एन्कोडिंग, हफमैन एन्कोडिंग, लंबे स्ट्रिंग्स के लिए gzip) का उपयोग करके स्ट्रिंग को संपीड़ित करने का प्रयास करता है और सबसे कम परिणाम वाला सबसे चुनता है (सबसे खराब स्थिति में, यह utf- 8 एन्कोडिंग, ताकि आप कभी भी अंतरिक्ष खोने का जोखिम न लें)।

मैं इसे उपयोगी हो सकता है उम्मीद है, यहाँ लिंक https://github.com/lithedream/lithestring

संपादित है: मैंने महसूस किया कि अपने तार हमेशा "लंबे समय" कर रहे हैं, उन लोगों के आकार के लिए gzip पर मेरे पुस्तकालय चूक, मुझे डर है मैं आप के लिए बेहतर नहीं कर सकते ।

संबंधित मुद्दे