一文詳解JAVA中InputStreamReader流
一、InputStreamReader類
API文檔說明:InputStreamReader類是從字節(jié)流到字符流的橋接器:它使用指定的字符集讀取字節(jié)并將它們解碼為字符。 它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集。每次調用一個InputStreamReader的read()方法都可能導致從底層字節(jié)輸入流中讀取一個或多個字節(jié)。 為了實現(xiàn)字節(jié)到字符的有效轉換,可以從基礎流中提取比滿足當前讀取操作所需的更多字節(jié)。為了獲得最高效率,請考慮在BufferedReader中包裝InputStreamReader
其繼承Reader類
public class InputStreamReader extends Reader {}
1)字節(jié)流到字符流的橋梁怎么理解?
1、計算機存儲的單位是字節(jié),如盡管txt文本中有中文漢字這樣的字符,但是對計算機而言,其是字節(jié)形式存在的
2、字節(jié)流讀取是單字節(jié)讀取,但是不同字符集解碼成字符需要不通過個數(shù),因此字節(jié)流讀取會報錯
3、 那么就需要一個流把字節(jié)流讀取的字節(jié)進行緩沖而后在通過字符集解碼成字符返回,因而形式上看是字符流
4、InputStreamReader流就是起這個作用,實現(xiàn)從字節(jié)流到字符流的轉換
2)使用指定的字符集讀取字節(jié)并將它們解碼為字符怎么理解?
字節(jié)本質是8個二進制位,且不同的字符集對同一字節(jié)解碼后的字符結果是不同的,因此在讀取字符時務必要指定合適的字符集,否則讀取的內容會產生亂碼
3)它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集怎么理解?
意味著InputStreamReader類有多個方法或者多個構造方法來設置字符集
4)每次調用一個InputStreamReader的read()方法都可能導致從底層字節(jié)輸入流中讀取一個或多個字節(jié)怎么理解?
read()方法會嘗試盡量沖底層字節(jié)流中讀取2個字符到字符緩沖區(qū)中,注意這里是盡量,若遇到文件最后字符,則就只能讀取到1個字符,因此每次read()方法讀取的字節(jié)數(shù)是不定的
5)為了實現(xiàn)字節(jié)到字符的有效轉換,可以從基礎流中提取比滿足當前讀取操作所需的更多字節(jié),請考慮在BufferedReader中包裝InputStreamReader
該話暫未理解,需要了解BufferedReader類后對比讀取效率才可得出答案
二、InputStreamReader構造方法
1)使用默認的字符集構造InputStreamReader流:本質是初始化其實例域的一個變量,并未看到任何關于字符集的設置
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
2)使用指定的字符集名稱構造InputStreamReader流:本質是初始化其實例域的一個變量,可以發(fā)現(xiàn)字符集是初始化方法的第三個參數(shù)
public InputStreamReader(InputStream in, String charsetName)
throws UnsupportedEncodingException
{
super(in);
if (charsetName == null)
throw new NullPointerException("charsetName");
sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
}
3)sd變量:本質是StreamDecoder類的對象,InputStreamReader的構造方法就是在給此對象做初始化操作
private final StreamDecoder sd;
三、InputStreamReaderAPI
1、我們可以發(fā)現(xiàn)InputStreamReaderAPI類的所有API都是利用了sd變量的,因此可以看出InputStreamReader類的方法本質是調用StreamDecoder類方法
2、因此我們需要了解StreamDecoder類,以便了解到InputStreamReader類的方法是如何起實質性作用的
/**
* 獲取設置的字符集
*/
public String getEncoding() {
return sd.getEncoding();
}
/**
* 讀取流并返回一個字符,遇到文件末尾返回-1
*/
public int read() throws IOException {
return sd.read();
}
/**
* 讀取字符到字符數(shù)組的部分中,遇到文件末尾返回-1
*/
public int read(char cbuf[], int offset, int length) throws IOException {
return sd.read(cbuf, offset, length);
}
/**
* 檢測流是否準備好唄讀取
*/
public boolean ready() throws IOException {
return sd.ready();
}
/**
* 關閉流并釋放資源
*/
public void close() throws IOException {
sd.close();
}
四、InputStreamReader類與FileReader類關系
1、FileReader類僅僅是InputStreamReader的簡單衍生并未擴展任何功能
2、FileReader類讀取數(shù)據(jù)實質是InputStreamReader類在讀取,而InputStreamReader讀取數(shù)據(jù)實際是StreamDecoder類讀取
3、因此在使用字符輸入流的時候實際是StreamDecoder類在發(fā)揮作用
到此這篇關于一文詳解JAVA中InputStreamReader流的文章就介紹到這了,更多相關 JAVA InputStreamReader流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)
這篇文章主要為大家介紹了詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
spring boot使用sharding jdbc的配置方式
這篇文章主要介紹了spring boot使用sharding jdbc的配置方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
詳解基于MybatisPlus兩步實現(xiàn)多租戶方案
這篇文章主要介紹了詳解基于MybatisPlus兩步實現(xiàn)多租戶方案,本文分兩步,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
SpringBoot整合WebService的實戰(zhàn)案例
WebService是一個SOA(面向服務的編程)的架構,它是不依賴于語言,平臺等,可以實現(xiàn)不同的語言間的相互調用,這篇文章主要給大家介紹了關于SpringBoot整合WebService的相關資料,需要的朋友可以參考下2024-07-07

