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