資源描述:
《java教程:字符串的壓縮與解壓》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、Java教程:字符串的壓縮與解壓時間:2012-05-1409:36點擊:107次【大中小】本節(jié)摘要:本節(jié)主要簡單介紹對字符串的壓縮與解壓。1.引言最近在做項目中,平臺提供一個http服務給其他系統(tǒng)調(diào)用,然后我接收到其他系統(tǒng)的json格式的報文后去解析,然后用拿到的數(shù)據(jù)去調(diào)用corba服務,我再把corba的返回值封裝完成json字符串返回給外部系統(tǒng)。遇到一個接口去調(diào)用corba服務,然后corba返回的數(shù)據(jù)經(jīng)過封裝后字符串的長度達到7M左右,導致http客戶端無法正常的接收完所有的數(shù)據(jù)。你可能會說這個接
2、口設(shè)計的不合理,為什么不增加查詢條件把查詢條件范圍縮小一點?但是,這個不是本節(jié)要討論的內(nèi)容,主要是因為corba服務已經(jīng)發(fā)布用了很久且不在此次項目改造范圍之內(nèi),再者這個corba服務已經(jīng)上線用了N久,輕易的改變可能會導致未知的錯誤。簽于此,我想到可以把json格式的字符串給壓縮,然后客戶端再解壓。(一是字符串的壓縮比例比較的高,二是字符串的壓縮和解壓實現(xiàn)起來也比較簡單)。雖然,最后沒有用到字符串的壓縮和解壓的方式,而是修改客戶端(1.http客戶端進一步精確查詢條件2.讀取返回數(shù)據(jù)流采用循環(huán)讀取的方式)來
3、解決此問題,我還是把字符串的壓縮和解壓做一下簡單的記錄。2.關(guān)于壓縮與解壓壓縮算法有多種,我說知道和接觸有javaI/O自帶的zip和gzip兩種方式。本節(jié)主要來簡單介紹一下在系統(tǒng)交互之間遇到大容量的字符串數(shù)據(jù)交互時,采用一端壓縮,另一端再解壓的方式來發(fā)送和接收數(shù)據(jù)。關(guān)于此次的壓縮和解壓用到的主要就是GZIPOutputStream和GZIPInputStream類,此類的相關(guān)介紹在JDK中有詳細的介紹,這里就不再累述了。?3.代碼如下:?壓縮:壓縮????/**?????*字符串的壓縮?????*???
4、??*@paramstr?????*???????????待壓縮的字符串?????*@return???返回壓縮后的字符串?????*@throwsIOException?????*/????publicstaticStringcompress(Stringstr)throwsIOException{????????if(null==str
5、
6、str.length()<=0){????????????returnstr;????????}????????//創(chuàng)建一個新的byte數(shù)組輸出流????????B
7、yteArrayOutputStreamout=newByteArrayOutputStream();????????//使用默認緩沖區(qū)大小創(chuàng)建新的輸出流????????GZIPOutputStreamgzip=newGZIPOutputStream(out);????????//將b.length個字節(jié)寫入此輸出流????????gzip.write(str.getBytes());????????gzip.close();????????//使用指定的charsetName,通過解碼字節(jié)將緩沖區(qū)內(nèi)容轉(zhuǎn)
8、換為字符串????????returnout.toString("ISO-8859-1");????}解壓:>?/**?????*字符串的解壓?????*?????*@paramstr?????*???????????對字符串解壓?????*@return???返回解壓縮后的字符串?????*@throwsIOException?????*/????publicstaticStringunCompress(Stringstr)throwsIOException{????????if(null==str
9、
10、
11、str.length()<=0){????????????returnstr;????????}????????//創(chuàng)建一個新的byte數(shù)組輸出流????????ByteArrayOutputStreamout=newByteArrayOutputStream();????????//創(chuàng)建一個ByteArrayInputStream,使用buf作為其緩沖區(qū)數(shù)組????????ByteArrayInputStreamin=newByteArrayInputStream(str????????????????
12、.getBytes("ISO-8859-1"));????????//使用默認緩沖區(qū)大小創(chuàng)建新的輸入流????????GZIPInputStreamgzip=newGZIPInputStream(in);????????byte[]buffer=newbyte[256];????????intn=0;????????while((n=gzip.read(buffer))>=0){//將未壓縮數(shù)據(jù)讀入字節(jié)數(shù)組??????????