<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統(tǒng)計

    留言簿(23)

    積分與排名

    優(yōu)秀學習網(wǎng)站

    友情連接

    閱讀排行榜

    評論排行榜

    Java解析網(wǎng)絡(luò)數(shù)據(jù)流的三種特殊方法

    Java作為最開放的語言,已越來越受到網(wǎng)絡(luò)程序員的青睞。但這一青睞族有著同樣的經(jīng)歷——曾經(jīng)都為網(wǎng)絡(luò)上通信的Java數(shù)據(jù)格式而煩腦。

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

    UTF8轉(zhuǎn)換成GB2312 當我們在基于HTTP協(xié)議的JSP或Servlet的應(yīng)用中獲取數(shù)據(jù)或發(fā)送請求時,JVM會把輸送的數(shù)據(jù)編碼成UTF8格式。如果我們直接從HTTP流中提取中文數(shù)據(jù),提取的結(jié)果為“????”(可能更多問號),為轉(zhuǎn)換成我們能夠理解的中文字符,我們需要把UTF8轉(zhuǎn)換成GB2312,借助ISO-8859-1標準編碼能夠輕易的實現(xiàn),下面的代碼實現(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的起始下標,int len指定需要讀取的長度,方法返回實際讀取的字節(jié)數(shù)。剛學Java的朋友可能要說:先定義一個與流長度等長的字節(jié)數(shù)組,調(diào)用read方法,指定起始下標為0,指定讀取長度與數(shù)組長度等長,不是一下子可以讀出來了嗎?說的沒錯,筆者曾經(jīng)也試著這樣讀取數(shù)據(jù),但后來發(fā)現(xiàn)在讀取網(wǎng)絡(luò)數(shù)據(jù)時很不安全,我們想想在網(wǎng)絡(luò)上獲取數(shù)據(jù)可能并沒那么流暢,數(shù)據(jù)流的傳送可能會斷斷續(xù)續(xù),所以并不能保證一次就能讀取全部數(shù)據(jù),特別是在讀取大容量數(shù)據(jù)時更是如此,所以我們必須在讀取數(shù)據(jù)時檢測實際讀到的長度,如果沒有讀完已知長度的數(shù)據(jù)就應(yīng)該再次讀取,以此循環(huán)檢測,直到實際讀取的長度累加與已知的長度相等,下面的代碼實現(xiàn)了這一功能:

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

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

    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); //每次實際讀取長度存于rbyte中

    for(int i=0;i<rbyte;i++) {

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

    }

    count += rbyte;

    }

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

    ByteArrayOutputStream swapStream = new ByteArrayOutputStream();

    byte[] buff = new byte[100]; //buff用于存放循環(huán)讀取的臨時數(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é)果

    上面介紹了三種比較實用的Java數(shù)據(jù)轉(zhuǎn)換,有興趣的朋友可通過nbDeveloper@hotmail.com與筆者取得聯(lián)系,進一步交流其它有關(guān)XML應(yīng)用、程序設(shè)計模式、J2EE開發(fā)以及UML等知識。

    posted on 2007-11-07 13:27 都市淘沙者 閱讀(1377) 評論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

    主站蜘蛛池模板: jlzzjlzz亚洲乱熟在线播放| 日韩免费电影网址| 国产免费黄色无码视频 | 亚洲成AV人综合在线观看| 亚洲三级高清免费| 免费无码又爽又黄又刺激网站 | 亚洲国产一区二区a毛片| 亚洲另类春色校园小说| 亚洲丶国产丶欧美一区二区三区| 真正全免费视频a毛片| 最近更新免费中文字幕大全| 成人浮力影院免费看| 免费一级毛片在线播放| 久久亚洲国产欧洲精品一| 亚洲伊人久久大香线蕉| 日韩在线观看免费完整版视频| 免费国产成人午夜在线观看| 无码国产精品一区二区免费I6| 亚洲午夜爱爱香蕉片| 亚洲乱码日产精品BD在线观看| 色吊丝免费观看网站| 亚洲成人免费网址| 亚洲国产高清精品线久久| 亚洲国产午夜电影在线入口| 一区二区三区免费视频观看| 噼里啪啦免费观看高清动漫4| 亚洲人成网站在线播放vr| 亚洲av无码av在线播放| 3344免费播放观看视频| 青青草原亚洲视频| mm1313亚洲国产精品无码试看| 久久久久免费看成人影片| 又黄又爽无遮挡免费视频| 亚洲一级毛片免费在线观看| 在线观看片免费人成视频无码| 国产一区二区三区免费视频| 亚洲国产精品一区二区三区在线观看 | 亚洲国产精品嫩草影院| 成人午夜免费福利视频| 18gay台湾男同亚洲男同| 精品国产污污免费网站 |