Java作為開放的語言,已越來越受到網(wǎng)絡(luò)程序員的青睞。但這一青睞族有著同樣的經(jīng)歷——曾經(jīng)都為網(wǎng)絡(luò)上通信的Java數(shù)據(jù)格式而煩腦。
筆者也不例外,曾經(jīng)為此而查閱了很多文檔,經(jīng)過反復(fù)測試才得以解決,如今筆者已經(jīng)在所從事的很多電子政務(wù)項(xiàng)目中順利的應(yīng)用。今天筆者寫此文,介紹用Java解析網(wǎng)絡(luò)數(shù)據(jù)的三種特殊方法,希望對(duì)正在尋求這方面問題答案的讀者有所幫助。
UTF8轉(zhuǎn)換成GB2312 當(dāng)我們?cè)诨贖TTP協(xié)議的JSP或Servlet的應(yīng)用中獲取數(shù)據(jù)或發(fā)送請(qǐng)求時(shí),JVM會(huì)把輸送的數(shù)據(jù)編碼成UTF8格式。如果我們直接從HTTP流中提取中文數(shù)據(jù),提取的結(jié)果為“????”(可能更多問號(hào)),為轉(zhuǎn)換成我們能夠理解的中文字符,我們需要把UTF8轉(zhuǎn)換成GB2312,借助ISO-8859-1標(biāo)準(zhǔn)編碼能夠輕易的實(shí)現(xiàn),下面的代碼實(shí)現(xiàn)了這一功能:
byte [] b;
String utf8_value;
utf8_value = request.getParameter("NAME");//從HTTP流中取"NAME"的UTF8數(shù)據(jù)
b = utf8_value.getBytes("8859_1"); //中間用ISO-8859-1過渡
String name = new String(b, "GB2312"); //轉(zhuǎn)換成GB2312字符
在知道流長度的情況下將輸入流轉(zhuǎn)換成字節(jié)數(shù)組 Java中的輸入流抽象類InputStream有int read(byte[] b, int off, int len)方法,參數(shù)中byte[] b是用來存放從InputStream中讀取的數(shù)據(jù),int off指定數(shù)組b的偏移地址,也就是數(shù)組b的起始下標(biāo),int len指定需要讀取的長度,方法返回實(shí)際讀取的字節(jié)數(shù)。剛學(xué)Java的朋友可能要說:先定義一個(gè)與流長度等長的字節(jié)數(shù)組,調(diào)用read方法,指定起始下標(biāo)為0,指定讀取長度與數(shù)組長度等長,不是一下子可以讀出來了嗎?說的沒錯(cuò),筆者曾經(jīng)也試著這樣讀取數(shù)據(jù),但后來發(fā)現(xiàn)在讀取網(wǎng)絡(luò)數(shù)據(jù)時(shí)很不安全,我們想想在網(wǎng)絡(luò)上獲取數(shù)據(jù)可能并沒那么流暢,數(shù)據(jù)流的傳送可能會(huì)斷斷續(xù)續(xù),所以并不能保證一次就能讀取全部數(shù)據(jù),特別是在讀取大容量數(shù)據(jù)時(shí)更是如此,所以我們必須在讀取數(shù)據(jù)時(shí)檢測實(shí)際讀到的長度,如果沒有讀完已知長度的數(shù)據(jù)就應(yīng)該再次讀取,以此循環(huán)檢測,直到實(shí)際讀取的長度累加與已知的長度相等,下面的代碼實(shí)現(xiàn)了這一功能:
ServletInputStream inStream = request.getInputStream(); //取HTTP請(qǐng)求流
int size = request.getContentLength(); //取HTTP請(qǐng)求流長度
byte[] buffer = new byte[size]; //用于緩存每次讀取的數(shù)據(jù)
byte[] in_b = new byte[size]; //用于存放結(jié)果的數(shù)組
int count = 0;
int rbyte = 0;
while (count < size) { //循環(huán)讀取
rbyte = inStream.read(buffer); //每次實(shí)際讀取長度存于rbyte中
for(int i=0;i
in_b[count + i] = buffer[i];
}
count += rbyte;
}
在不知道流長度的情況下將輸入流轉(zhuǎn)換成字節(jié)數(shù)組 前面介紹了已知流長度的情況下的轉(zhuǎn)換方法,那么當(dāng)我們不知道流有多長時(shí),也就是說不能確定轉(zhuǎn)換后的字節(jié)數(shù)組有多大時(shí),該怎么處理呢?筆者查看了JDK文檔之后發(fā)現(xiàn)ByteArrayOutputStream有一個(gè)byte[] toByteArray()方法,該方法會(huì)自動(dòng)創(chuàng)建一個(gè)字節(jié)數(shù)組,然后返回。于是就巧妙的用ByteArrayOutputStream來作中間過渡實(shí)現(xiàn)轉(zhuǎn)換,其它處理跟上面所介紹已知長度的情況差不多。假設(shè)需要被轉(zhuǎn)換的流已經(jīng)放在inStream里了,我們可以用如下的代碼實(shí)現(xiàn)這一功能:
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循環(huán)讀取的臨時(shí)數(shù)據(jù)
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in_b = swapStream.toByteArray(); //in_b為轉(zhuǎn)換之后的結(jié)果
上面介紹了三種比較實(shí)用的Java數(shù)據(jù)轉(zhuǎn)換,有興趣的朋友可通過nbDeveloper@hotmail.com與筆者取得聯(lián)系,進(jìn)一步交流其它有關(guān)XML應(yīng)用、程序設(shè)計(jì)模式、J2EE開發(fā)以及UML等知識(shí)。
Java解析網(wǎng)絡(luò)數(shù)據(jù)流的三種特殊方法
更新時(shí)間: 2006-02-17 14:13:07來源: 粵嵌教育瀏覽量:3460
粵嵌動(dòng)態(tài)
推薦閱讀
- ·中山豐旭電子實(shí)業(yè)有限公司專場招聘會(huì)
- ·東莞市福鑫達(dá)精密技術(shù)有限公司專場招聘
- ·嵌入式系統(tǒng)中常用的存儲(chǔ)設(shè)備及其特點(diǎn)
- ·廣州2451嵌入式開發(fā)就業(yè)班
- ·廣州2450嵌入式開發(fā)就業(yè)班
- ·粵嵌科技攜騰訊共推產(chǎn)教融合
- ·廣東英維克技術(shù)有限公司專場招聘(長沙校區(qū))
- ·廣州2448全網(wǎng)運(yùn)營就業(yè)班
- ·北京朝歌數(shù)碼科技股份有限公司粵嵌專場企業(yè)招聘會(huì)線正宣講
- ·實(shí)驗(yàn)室建設(shè)案例丨湖南科技大學(xué)-智能網(wǎng)聯(lián)車輛軟件設(shè)計(jì)與服務(wù)平臺(tái)項(xiàng)目