1. 程式人生 > >Java InputStream 、 InputStreamReader和BufferedReader

Java InputStream 、 InputStreamReader和BufferedReader

https overflow 截圖 nco ktr one num import 語言

https://blog.csdn.net/zgljl2012/article/details/47267609

在Java中,上述三個類經常用於處理數據流,下面介紹一下三個類的不同之處以及各自的用法。

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

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


  • 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)); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

通過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將字節流轉化為字符流了。


  • 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));
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

先獲取字節流,然後創建InputStreamReader將字節流轉化成字符流,並指定其字符集為UTF-8,然後使用強制轉化將read到的int字節轉化為char型,此時已可以輸出中文字符,並且可速度上看出,輸出字符流比輸出字節流要快。下面是結果的部分截圖:
技術分享圖片


  • 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));
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

獲取字符流後,可直接緩存,然後從緩存區取出,這時的速度比InputStreamReader又將快上很多。輸出結果同上。


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

Java InputStream 、 InputStreamReader和BufferedReader