您好,登錄后才能下訂單哦!
本篇內容主要講解“JAVA中InputStreamReader流怎么構造”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JAVA中InputStreamReader流怎么構造”吧!
API文檔說明:InputStreamReader類是從字節流到字符流的橋接器:它使用指定的字符集讀取字節并將它們解碼為字符。 它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集。每次調用一個InputStreamReader的read()方法都可能導致從底層字節輸入流中讀取一個或多個字節。 為了實現字節到字符的有效轉換,可以從基礎流中提取比滿足當前讀取操作所需的更多字節。為了獲得最高效率,請考慮在BufferedReader中包裝InputStreamReader
其繼承Reader類
public class InputStreamReader extends Reader {}
1)字節流到字符流的橋梁怎么理解?
1、計算機存儲的單位是字節,如盡管txt文本中有中文漢字這樣的字符,但是對計算機而言,其是字節形式存在的
2、字節流讀取是單字節讀取,但是不同字符集解碼成字符需要不通過個數,因此字節流讀取會報錯
3、 那么就需要一個流把字節流讀取的字節進行緩沖而后在通過字符集解碼成字符返回,因而形式上看是字符流
4、InputStreamReader流就是起這個作用,實現從字節流到字符流的轉換
2)使用指定的字符集讀取字節并將它們解碼為字符怎么理解?
字節本質是8個二進制位,且不同的字符集對同一字節解碼后的字符結果是不同的,因此在讀取字符時務必要指定合適的字符集,否則讀取的內容會產生亂碼
3)它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集怎么理解?
意味著InputStreamReader類有多個方法或者多個構造方法來設置字符集
4)每次調用一個InputStreamReader的read()方法都可能導致從底層字節輸入流中讀取一個或多個字節怎么理解?
read()方法會嘗試盡量沖底層字節流中讀取2個字符到字符緩沖區中,注意這里是盡量,若遇到文件最后字符,則就只能讀取到1個字符,因此每次read()方法讀取的字節數是不定的
5)為了實現字節到字符的有效轉換,可以從基礎流中提取比滿足當前讀取操作所需的更多字節,請考慮在BufferedReader中包裝InputStreamReader
該話暫未理解,需要了解BufferedReader類后對比讀取效率才可得出答案
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流:本質是初始化其實例域的一個變量,可以發現字符集是初始化方法的第三個參數
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;
1、我們可以發現InputStreamReaderAPI類的所有API都是利用了sd變量的,因此可以看出InputStreamReader類的方法本質是調用StreamDecoder類方法
2、因此我們需要了解StreamDecoder類,以便了解到InputStreamReader類的方法是如何起實質性作用的
/** * 獲取設置的字符集 */ public String getEncoding() { return sd.getEncoding(); } /** * 讀取流并返回一個字符,遇到文件末尾返回-1 */ public int read() throws IOException { return sd.read(); } /** * 讀取字符到字符數組的部分中,遇到文件末尾返回-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(); }
1、FileReader類僅僅是InputStreamReader的簡單衍生并未擴展任何功能
2、FileReader類讀取數據實質是InputStreamReader類在讀取,而InputStreamReader讀取數據實際是StreamDecoder類讀取
3、因此在使用字符輸入流的時候實際是StreamDecoder類在發揮作用
到此,相信大家對“JAVA中InputStreamReader流怎么構造”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。