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