java后台發送請求並獲取返回值(續)


在java后端發送請求給另一個平台,從而給前端實現 "透傳”的過程中,出現:數據請求到了並傳到了前端,但是控制台打印時中文顯示Unicode碼而前端界面中中文顯示不出來!!!開始懷疑是編碼格式或透傳過程中處理的問題,將編碼格式進行了設置並查資料了解了一下透傳過程中代碼的處理方法,雖然最后發現是前后端定義的json串的屬性名稱不一致導致(后端傳輸數據中屬性名label寫成了lable。。。),但在此還是記錄一下“透傳”處理過程中處理數據流的三種方式。

主要是介紹經常用於處理數據流的InputStream 、InputStreamReader和BufferedReader 三個類,並給出示例Demo。

  • InputStream : 是所有字節輸入流的超類,一般使用它的子類:FileInputStream等,它能輸出字節流;
  • InputStreamReader : 是字節流與字符流之間的橋梁,能將字節流輸出為字符流,並且能為字節流指定字符集,可輸出一個個的字符;
  • BufferedReader : 提供通用的緩沖方式文本讀取,readLine讀取一個文本行, 從字符輸入流中讀取文本,緩沖各個字符,從而提供字符、數組和行的高效讀取。
  •  

    下面有三個Demo(Demo訪問百度主頁獲取字節流然后輸出)來分別說明三個類的作用:

    Demo1:

    //InputStream 類
    package 數據流;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    public class Test_InputStream {
        /**
         * 獲取字節流
         * @param url
         * @return
         */
        private String getStream(String url){
            //獲取字節流
            InputStream in = null;
            String result = "";
            try {
                in = new URL(url).openStream();
                int tmp;
                while((tmp = in.read()) != -1){
                    result += (char)tmp;
                }
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //輸出字節流
            return result;
        }
        public static void main(String[] args){
            String URL = "http://www.baidu.com";
            Test_InputStream test = new Test_InputStream();
            System.out.println(test.getStream(URL));
        }
    }

    通過URL連接獲取了InputStream流連接,然后通過read方法來一個字節一個字節的讀取字節流並組合在一起(read方法返回-1則數據讀取結束),最后以reasults返回。

    輸出如下:60 33 68 79 67 84 89 80 69 32 104 116 109 108 62 60 33 45 45 83 84 65 84 ……

    這就是字節流,每個數字都是一個字節(Byte,8位),所以如果讀取英文的話,用字節流,然后用(char)強制轉化一下就行了,但如果有中文等雙字節語言或者說需要指定字符編碼集的情況,就必須用到InputStreamReader將字節流轉化為字符流了。

     

    Demo2:

    //InputStreamReader類
    package 數據流;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    public class Test_InputStreamReader {
        /*
         * 得到字符流前需先有字節流
         */
        private String getStream(String url){
            try {
                //得到字節流
                InputStream in = new URL(url).openStream();
                //將字節流轉化成字符流,並指定字符集
                InputStreamReader isr = new InputStreamReader(in,"UTF-8");
                String results = "";
                int tmp;
                while((tmp = isr.read()) != -1){
                    results += (char)tmp;
                }
                return results;
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String URL = "http://www.baidu.com";
            Test_InputStreamReader test = new Test_InputStreamReader();
            System.out.println(test.getStream(URL));
        }
    }
    先獲取字節流,然后創建InputStreamReader將字節流轉化成字符流,並指定其字符集為UTF-8,然后使用強制轉化將read到的int字節轉化為char型,此時已可以輸出中文字符,並且可速度上看出,輸出字符流比輸出字節流要快。下面是結果的部分截圖:

    image

     

    Demo3:

    //BufferedReader類
    package 數據流;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    public class Test_BufferedReader {
        /*
         * 字節流——字符流——緩存輸出的字符流
         */
        private String getStream(String url){
            try {
                //得到字節流
                InputStream in = new URL(url).openStream();
                //將字節流轉化成字符流,並指定字符集
                InputStreamReader isr = new InputStreamReader(in,"UTF-8");
                //將字符流以緩存的形式一行一行輸出
                BufferedReader bf = new BufferedReader(isr); 
                String results = "";
                String newLine = "";
                while((newLine = bf.readLine()) != null){
                    results += newLine+"\n";
                }
                return results;
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String URL = "http://www.baidu.com";
            Test_BufferedReader test = new Test_BufferedReader();
            System.out.println(test.getStream(URL));
        }
    }
    獲取字符流后,可直接緩存,然后從緩存區取出,這時的速度比InputStreamReader又將快上很多。輸出結果同上。

    總結: 在讀取網絡數據流的時候,可以通過先用InputStream獲取字節流、InputStreamReader將字節流轉化成字符流、BufferedReader將字符流以緩存形式輸出的方式來快速獲取網絡數據流。

     

    參考網址:http://blog.csdn.net/zgljl2012/article/details/47267609


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM