JAVA中的OutputStreamWriter流解析
一、OutputStreamWriter流
API說明:OutputStreamWriter是從字符流到字節(jié)流的橋接:使用指定的字符集將寫入其中的字符編碼為字節(jié)。它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集。 每次調用write()方法都會導致在給定字符上調用編碼轉換器。生成的字節(jié)在寫入底層輸出流之前在緩沖區(qū)中累積??梢灾付ù司彌_區(qū)的大小,但默認情況下,它足夠大,可用于大多數(shù)用途。請注意,傳遞給write()方法的字符不會被緩沖。 為了獲得最高效率,請考慮在BufferedWriter中包裝OutputStreamWriter,以避免頻繁的轉換器調用
1)OutputStreamWriter是從字符流到字節(jié)流的橋接怎么理解?
1、字符的輸出需要通過字符流來操作,但是本質最后還是通過字節(jié)流輸出到計算機上進行存儲的
2、 因此OutputStreamWriter流的作用就是利用字節(jié)流作為底層輸出流然后構建字符輸出流,字符輸出流輸出字符到流中,然后通過指定的字符集把流中的字符編碼成字節(jié)輸出到字節(jié)流中,其作用就是一個橋梁,使得雙方鏈接起來
2)使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的默認字符集怎么理解?
OutputStreamWriter流中的構造方法可以指定字符集,或者不設置取默認值
3)每次調用write()方法都會導致在給定字符上調用編碼轉換器。生成的字節(jié)在寫入底層輸出流之前在緩沖區(qū)中累積怎么理解
OutputStreamWriter中存在一個字節(jié)緩沖區(qū),用于存儲每次輸出的字符編碼后的字節(jié),然后待字符輸出流輸出完畢一次性的將存儲的字節(jié)全部輸出給底層的字節(jié)輸出流
4)傳遞給write()方法的字符不會被緩沖怎么理解?
沒有理解清楚,因為write()方法會傳遞字符作為方法實參,若該字符不緩沖,那緩沖區(qū)的字節(jié)從何而來~~~~~
5)考慮在BufferedWriter中包裝OutputStreamWriter,以避免頻繁的轉換器調用?
1、可以通過OutputStreamWriter對象來構建BufferedWriter對象,以提高字符輸出的效率,
2、OutputStreamWriter中頻繁的調用了字符編碼器進行轉換,而這樣的轉換過程是很耗資源的?
public class OutputStreamWriter extends Writer{}二、OutputStreamWriter流構造函數(shù)
1)利用輸出流構建默認字符編碼的OutputStreamWriter流:本質是初始化StreamEncoder對象
private final StreamEncoder se;
public OutputStreamWriter(OutputStream out) {
super(out);
try {
se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}2)通過指定的字符編碼構建OutputStreamWriter流:本質是初始化StreamEncoder對象但是指定了字符編碼
public OutputStreamWriter(OutputStream out, String charsetName)
throws UnsupportedEncodingException
{
super(out);
if (charsetName == null)
throw new NullPointerException("charsetName");
se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
}3)FileWriter類構造調用OutputStreamWriter類構造方法,而OutputStreamWriter類構造方法本質是在初始化StreamEncoder對象,因此最終的實現(xiàn)要去StreamEncoder源碼進行查看
三、OutputStreamWriter流API
1)寫入一個字符到流中:本質是調用StreamEncoder的write(int c)方法
public void write(int c) throws IOException {
se.write(c);
}2)寫入字符數(shù)組的一部分到流中:本質上調用StreamEncoder的write(char cbuf[], int off, int len)方法
public void write(char cbuf[], int off, int len) throws IOException {
se.write(cbuf, off, len);
}3)寫入字符串的一部分到流中:本質是調用StreamEncoder的write(String str, int off, int len)方法
public void write(String str, int off, int len) throws IOException {
se.write(str, off, len);
}4)刷新流中的數(shù)據(jù):本質是調用StreamEncoder的flush()方法
public void flush() throws IOException {
se.flush();
}5)關閉流但是先刷新流:即該流必須要先調用flush方法然后再調用close方法
public void close() throws IOException {
se.close();
}6)OutputStreamWriter流的API和構造方法本質全部是調用StreamEncoder流的方法,因此需要了解OutputStreamWriter流的具體實現(xiàn)需要查看StreamEncoder流源碼才可知
到此這篇關于JAVA中的OutputStreamWriter流解析的文章就介紹到這了,更多相關OutputStreamWriter流解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Security學習之rememberMe自動登錄的實現(xiàn)
這篇文章主要給大家介紹了關于Spring Security學習之rememberMe自動登錄的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-06-06
如何使用Comparator比較接口實現(xiàn)ArrayList集合排序
這篇文章主要介紹了如何使用Comparator比較接口實現(xiàn)ArrayList集合排序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
SpringMVC 通過ajax 實現(xiàn)文件上傳的步驟
使用form表單在springmvc 項目中上傳文件,文件上傳成功之后往往會跳轉到其他的頁面,但是有的時候,文件上傳成功的同時,并不需要進行頁面的跳轉,可以通過ajax來實現(xiàn)文件的上傳,下面給大家介紹SpringMVC 通過ajax 實現(xiàn)文件上傳的步驟,感興趣的朋友一起看看吧2025-05-05
java實現(xiàn)定制數(shù)據(jù)透視表的示例詳解
數(shù)據(jù)透視表(Pivot?Table)是一種數(shù)據(jù)分析工具,通常用于對大量數(shù)據(jù)進行匯總、分析和展示,本文主要介紹了如何使用Java將計算項添加到數(shù)據(jù)透視表中,感興趣的可以了解下2023-12-12

