Java InputStream 、 InputStreamReader和BufferedReader
阿新 • • 發佈:2018-08-14
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