專案之前都是好好的,最近現場那邊出現一個問題,報錯不是合法的json字串,這個json字串是通過http請求訪問獲得的,
通過直接在瀏覽器上直接訪問http這個請求,發現回傳的json也是完全正確的,后來排查代碼才發現了原來錯誤出在從位元組流中讀取資料這里:
看下之前出錯代碼:這個方法是處理InputStream,然后回傳成一個字串,
1 public String process(InputStream in, String charset) {
2 byte[] buf = new byte[1024];
3 StringBuffer sb = new StringBuffer();
4 try {
5 while (in.read(buf) != -1) {
6 sb.append(new String(buf, charset));
7 }
8 } catch (IOException e) {
9 e.printStackTrace();
10 }
11 return sb.toString();
12 }
有問題的代碼在第6行,發現之前專案沒出錯的原因是InputStream里面的資料少,還不夠1024個位元組,while那里回圈一次就好了,得到一個正確格式的json串;后面出錯了是因為InputStream里面資料比較多,while需要2次了,第一次讀取之后buf里面滿了,第二次讀取發現read(byte[])方法不會去清慷訓沖區陣列,第二次實際上read位元組只有100個,buf里面只替換前100個位元組內容,然后通過第6行代碼append到字串里了,就造成了最后獲得的字串不是json格式,造成之后json決議出錯,
知道問題后,將之前代碼改為下,既然每次不會去清慷訓沖區陣列內容,那就通過讀取長度來append字串,問題解決:
1 public String process(InputStream in, String charset) {
2 byte[] buf = new byte[1024];
3 StringBuffer sb = new StringBuffer();
4 int len = 0;
5 try {
6 while ((len=in.read(buf)) != -1) {
7 sb.append(new String(buf, 0, len, charset));
8 }
9 } catch (IOException e) {
10 e.printStackTrace();
11 }
12 return sb.toString();
13 }
后來查了下JDK API,發現API上也說明過了,只是以前沒注意,關鍵在于加黑字體,不影響b[k]到b[b.length-1]的元素:
附上API:
public int read(byte[] b) throws IOException
從輸入流中讀取一定數量的位元組,并將其存盤在緩沖區陣列b中,以整數形式回傳實際讀取的位元組數,
在輸入資料可用、檢測到檔案末尾或者拋出例外前,此方法一直阻塞,
如果b的長度為 0,則不讀取任何位元組并回傳0;否則,嘗試讀取至少一個位元組,如果因為流位于檔案末尾而沒有可用的位元組,則回傳值-1;否則,至少讀取一個位元組并將其存盤在b中,將讀取的第一個位元組存盤在元素b[0]中,下一個存盤在b[1]中,依次類推,讀取的位元組數最多等于b的長度,設 k 為實際讀取的位元組數;這些位元組將存盤在b[0]到b[k-1]的元素中,不影響b[k]到b[b.length-1]的元素,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/451227.html
標籤:Java
上一篇:企業微信第三方應用(三)基于springboot開發(獲取Ticket,auth_code)
下一篇:一文讀懂并發與并行
