一文詳解JAVA中InputStreamReader流
一、InputStreamReader類
API文檔說明:InputStreamReader類是從字節(jié)流到字符流的橋接器:它使用指定的字符集讀取字節(jié)并將它們解碼為字符。 它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集。每次調(diào)用一個InputStreamReader的read()方法都可能導(dǎo)致從底層字節(jié)輸入流中讀取一個或多個字節(jié)。 為了實現(xiàn)字節(jié)到字符的有效轉(zhuǎn)換,可以從基礎(chǔ)流中提取比滿足當前讀取操作所需的更多字節(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é)流到字符流的轉(zhuǎn)換
2)使用指定的字符集讀取字節(jié)并將它們解碼為字符怎么理解?
字節(jié)本質(zhì)是8個二進制位,且不同的字符集對同一字節(jié)解碼后的字符結(jié)果是不同的,因此在讀取字符時務(wù)必要指定合適的字符集,否則讀取的內(nèi)容會產(chǎn)生亂碼
3)它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集怎么理解?
意味著InputStreamReader類有多個方法或者多個構(gòu)造方法來設(shè)置字符集
4)每次調(diào)用一個InputStreamReader的read()方法都可能導(dǎo)致從底層字節(jié)輸入流中讀取一個或多個字節(jié)怎么理解?
read()方法會嘗試盡量沖底層字節(jié)流中讀取2個字符到字符緩沖區(qū)中,注意這里是盡量,若遇到文件最后字符,則就只能讀取到1個字符,因此每次read()方法讀取的字節(jié)數(shù)是不定的
5)為了實現(xiàn)字節(jié)到字符的有效轉(zhuǎn)換,可以從基礎(chǔ)流中提取比滿足當前讀取操作所需的更多字節(jié),請考慮在BufferedReader中包裝InputStreamReader
該話暫未理解,需要了解BufferedReader類后對比讀取效率才可得出答案
二、InputStreamReader構(gòu)造方法
1)使用默認的字符集構(gòu)造InputStreamReader流:本質(zhì)是初始化其實例域的一個變量,并未看到任何關(guān)于字符集的設(shè)置
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
2)使用指定的字符集名稱構(gòu)造InputStreamReader流:本質(zhì)是初始化其實例域的一個變量,可以發(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變量:本質(zhì)是StreamDecoder類的對象,InputStreamReader的構(gòu)造方法就是在給此對象做初始化操作
private final StreamDecoder sd;
三、InputStreamReaderAPI
1、我們可以發(fā)現(xiàn)InputStreamReaderAPI類的所有API都是利用了sd變量的,因此可以看出InputStreamReader類的方法本質(zhì)是調(diào)用StreamDecoder類方法
2、因此我們需要了解StreamDecoder類,以便了解到InputStreamReader類的方法是如何起實質(zhì)性作用的
/**
* 獲取設(shè)置的字符集
*/
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();
}
/**
* 關(guān)閉流并釋放資源
*/
public void close() throws IOException {
sd.close();
}
四、InputStreamReader類與FileReader類關(guān)系
1、FileReader類僅僅是InputStreamReader的簡單衍生并未擴展任何功能
2、FileReader類讀取數(shù)據(jù)實質(zhì)是InputStreamReader類在讀取,而InputStreamReader讀取數(shù)據(jù)實際是StreamDecoder類讀取
3、因此在使用字符輸入流的時候?qū)嶋H是StreamDecoder類在發(fā)揮作用
到此這篇關(guān)于一文詳解JAVA中InputStreamReader流的文章就介紹到這了,更多相關(guān) JAVA InputStreamReader流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解
這篇文章主要介紹了spring batch使用reader讀數(shù)據(jù)的內(nèi)存容量問題詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
Java實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫數(shù)字識別的示例詳解
這篇文章主要為大家詳細介紹了Java實現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫數(shù)字識別的相關(guān)方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01
Java兩個List<T> 求交集,差集,并集,去重后的并集
本文主要介紹了Java兩個List<T> 求交集,差集,并集,去重后的并集,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04
快速解決VS Code報錯:Java 11 or more recent is required to run. Ple
這篇文章主要介紹了快速解決VS Code報錯:Java 11 or more recent is required to run. Please download and install a recent JDK的相關(guān)資料,需要的朋友可以參考下2020-09-09
AJAX?SpringBoot?前后端數(shù)據(jù)交互的項目實現(xiàn)
本文主要介紹了AJAX?SpringBoot?前后端數(shù)據(jù)交互的項目實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
springboot接口多實現(xiàn)類選擇性注入解決方案
這篇文章主要為大家介紹了springboot接口多實現(xiàn)類選擇性注入解決方案的四種方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
java四種引用及在LeakCanery中應(yīng)用詳解
這篇文章主要介紹了java四種引用及在LeakCanery中應(yīng)用,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09

