Windows與Linux下InputStream讀取字節與字符的不一樣

近作了一個報文發送接收解析的客戶端,發現了這樣的問題: 
某程序: 
Java代碼   
        Socket con = new Socket(ip, port);//一個socket
	InputStream socketIn = con.getInputStream();
        InputStreamReader isr=new InputStreamReader(socketIn, "UTF-8");
        while ((headchar = isr.read()) != -1) {// 讀取報文頭 用字符流來讀取
				headres += (char) headchar;
			......//一些邏輯 處理報文頭
			}

        ...
        //報文頭讀完了 獲取了報文體的大小等內容 開始讀報文體
        byte tempbuf[] = new byte[buffsize];
			int start = 0;
			int tem = -1;
        //用字節流來讀報文體
			while ((tem = socketIn.read(tempbuf, start, buffsize)) != -1) {
				log.info("從"+start+"開始讀"+buffsize);
				log.info("實際讀取" + tem);
				if (tem < outparamsizes[i]) {
					start = start + tem;
					buffsize = buffsize - tem;
        ...//一些邏輯 處理報文體 讀取完畢
        }


這樣的程序,在windows下正常工做,再放到linux下,讀完報文頭開始讀取報文體的時候,並無從報文體的開頭開始讀取,而是丟失了報文體前面的一些數據,致使讀不到足夠的數據直到超時。 

通過一番調試和請教後發現緣由:在linux下一個InputStream不能用字符流和字節流分段讀取,由於linux下的字符因爲utf8編碼會多加幾位,用字符讀完報文頭後其實就已經多讀了許多位,再用字節讀就丟掉多讀的那部分了。 
所以,只要將讀取報文頭的部分也改爲字節流讀取就能夠了 
Java代碼  
while ((headchar = socketIn.read()) != -1) {
...}
相關文章
相關標籤/搜索