網絡數據流的java處理

wuhuif作爲最開放的語言,已越來越受到網絡程序員的青睞。但這一青睞族有着同樣的經歷——曾經都爲網絡上通信的wuhuif數據格式而煩腦。

筆者也不例外,曾經爲此而查閱了很多文檔,經過反覆測試才得以解決,如今筆者已經在所從事的很多電子政務項目中順利的應用。今天筆者寫此文,介紹用wuhuif解析網絡數據的三種特殊方法,希望對正在尋求這方面問題答案的讀者有所幫助。

UTF8
轉換成GB2312 當我們在基於HTTP協議的JSPServlet的應用中獲取數據或發送請求時,JVM會把輸送的數據編碼成UTF8格式。如果我們直接從HTTP流中提取中文數據,提取的結果爲“????”(可能更多問號),爲轉換成我們能夠理解的中文字符,我們需要UTF8轉換成GB2312,藉助ISO-8859-1標準編碼能夠輕易的實現,下面的代碼實現了這一功能:

byte [] b;

String utf8_value;

utf8_value = request.getParameter("NAME");//
HTTP流中取"NAME"UTF8數據


b = utf8_value.getBytes("8859_1"); //
中間用ISO-8859-1過渡

String name = new String(b, "GB2312"); //
轉換成GB2312字符


在知道流長度的情況下將輸入流轉換成字節數組 wuhuif中的輸入流抽象類InputStreamint read(byte[] b, int off, int len)方法,參數中byte[] b是用來存放從InputStream中讀取的數據,int off指定數組b的偏移地址,也就是數組b的起始下標,int len指定需要讀取的長度,方法返回實際讀取的字節數。剛學wuhuif的朋友可能要說:先定義一個與流長度等長的字節數組,調用read方法,指定起始下標爲0,指定讀取長度與數組長度等長,不是一下子可以讀出來了嗎?說的沒錯,筆者曾經也試着這樣讀取數據,但後來發現在讀取網絡數據時很不安全,我們想想在網絡上獲取數據可能並沒那麼流暢,數據流的傳送可能會斷斷續續,所以並不能保證一次就能讀取全部數據,特別是在讀取大容量數據時更是如此,所以我們必須在讀取數據時檢測實際讀到的長度如果沒有讀完已知長度的數據就應該再次讀取,以此循環檢測,直到實際讀取的長度累加與已知的長度相等,下面的代碼實現了這一功能:

ServletInputStream inStream = request.getInputStream(); //
HTTP請求流

int size = request.getContentLength(); //
HTTP請求流長度

byte[] buffer = new byte[size]; //
用於緩存每次讀取的數據

byte[] in_b = new byte[size]; //
用於存放結果的數組


int count = 0;

int rbyte = 0;

while (count < size) { //
循環讀取

rbyte = inStream.read(buffer); //
每次實際讀取長度存於rbyte

for(int i=0;i

in_b[count + i] = buffer[i];

}

count += rbyte;

}


在不知道流長度的情況下將輸入流轉換成字節數組 前面介紹了已知流長度的情況下的轉換方法,那麼當我們不知道流有多長時,也就是說不能確定轉換後的字節數組有多大時,該怎麼處理呢?筆者查看了JDK文檔之後發現ByteArrayOutputStream有一個byte[] toByteArray()方法,該方法會自動創建一個字節數組,然後返回。於是就巧妙的用ByteArrayOutputStream來作中間過渡實現轉換,其它處理跟上面所介紹已知長度的情況差不多。假設需要被轉換的流已經放在inStream裏了,我們可以用如下的代碼實現這一功能:

ByteArrayOutputStream swapStream = new ByteArrayOutputStream();

byte[] buff = new byte[100]; //buff
用於存放循環讀取的臨時數據

int  rc = 0;

while ( (rc = inStream.read(buff, 0, 100) ) > 0) {

swapStream.write(buff, 0, rc);

}

byte[] in_b = swapStream.toByteArray(); //in_b
爲轉換之後的結果

上面介紹了三種比較實用的wuhuif數據轉換,有興趣的朋友可通過[email protected]與筆者取得聯繫,進一步交流其它有關XML應用、程序設計模式、J2EE開發以及UML等知識。

 
發佈了47 篇原創文章 · 獲贊 2 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章