JAVA中的OutputStreamWriter流解析
一、OutputStreamWriter流
API說明:OutputStreamWriter是從字符流到字節(jié)流的橋接:使用指定的字符集將寫入其中的字符編碼為字節(jié)。它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺(tái)的默認(rèn)字符集。 每次調(diào)用write()方法都會(huì)導(dǎo)致在給定字符上調(diào)用編碼轉(zhuǎn)換器。生成的字節(jié)在寫入底層輸出流之前在緩沖區(qū)中累積??梢灾付ù司彌_區(qū)的大小,但默認(rèn)情況下,它足夠大,可用于大多數(shù)用途。請(qǐng)注意,傳遞給write()方法的字符不會(huì)被緩沖。 為了獲得最高效率,請(qǐng)考慮在BufferedWriter中包裝OutputStreamWriter,以避免頻繁的轉(zhuǎn)換器調(diào)用
1)OutputStreamWriter是從字符流到字節(jié)流的橋接怎么理解?
1、字符的輸出需要通過字符流來操作,但是本質(zhì)最后還是通過字節(jié)流輸出到計(jì)算機(jī)上進(jìn)行存儲(chǔ)的
2、 因此OutputStreamWriter流的作用就是利用字節(jié)流作為底層輸出流然后構(gòu)建字符輸出流,字符輸出流輸出字符到流中,然后通過指定的字符集把流中的字符編碼成字節(jié)輸出到字節(jié)流中,其作用就是一個(gè)橋梁,使得雙方鏈接起來
2)使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺(tái)的默認(rèn)字符集怎么理解?
OutputStreamWriter流中的構(gòu)造方法可以指定字符集,或者不設(shè)置取默認(rèn)值
3)每次調(diào)用write()方法都會(huì)導(dǎo)致在給定字符上調(diào)用編碼轉(zhuǎn)換器。生成的字節(jié)在寫入底層輸出流之前在緩沖區(qū)中累積怎么理解
OutputStreamWriter中存在一個(gè)字節(jié)緩沖區(qū),用于存儲(chǔ)每次輸出的字符編碼后的字節(jié),然后待字符輸出流輸出完畢一次性的將存儲(chǔ)的字節(jié)全部輸出給底層的字節(jié)輸出流
4)傳遞給write()方法的字符不會(huì)被緩沖怎么理解?
沒有理解清楚,因?yàn)閣rite()方法會(huì)傳遞字符作為方法實(shí)參,若該字符不緩沖,那緩沖區(qū)的字節(jié)從何而來~~~~~
5)考慮在BufferedWriter中包裝OutputStreamWriter,以避免頻繁的轉(zhuǎn)換器調(diào)用?
1、可以通過OutputStreamWriter對(duì)象來構(gòu)建BufferedWriter對(duì)象,以提高字符輸出的效率,
2、OutputStreamWriter中頻繁的調(diào)用了字符編碼器進(jìn)行轉(zhuǎn)換,而這樣的轉(zhuǎn)換過程是很耗資源的?
public class OutputStreamWriter extends Writer{}
二、OutputStreamWriter流構(gòu)造函數(shù)
1)利用輸出流構(gòu)建默認(rèn)字符編碼的OutputStreamWriter流:本質(zhì)是初始化StreamEncoder對(duì)象
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)通過指定的字符編碼構(gòu)建OutputStreamWriter流:本質(zhì)是初始化StreamEncoder對(duì)象但是指定了字符編碼
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類構(gòu)造調(diào)用OutputStreamWriter類構(gòu)造方法,而OutputStreamWriter類構(gòu)造方法本質(zhì)是在初始化StreamEncoder對(duì)象,因此最終的實(shí)現(xiàn)要去StreamEncoder源碼進(jìn)行查看
三、OutputStreamWriter流API
1)寫入一個(gè)字符到流中:本質(zhì)是調(diào)用StreamEncoder的write(int c)方法
public void write(int c) throws IOException { se.write(c); }
2)寫入字符數(shù)組的一部分到流中:本質(zhì)上調(diào)用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)寫入字符串的一部分到流中:本質(zhì)是調(diào)用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ù):本質(zhì)是調(diào)用StreamEncoder的flush()方法
public void flush() throws IOException { se.flush(); }
5)關(guān)閉流但是先刷新流:即該流必須要先調(diào)用flush方法然后再調(diào)用close方法
public void close() throws IOException { se.close(); }
6)OutputStreamWriter流的API和構(gòu)造方法本質(zhì)全部是調(diào)用StreamEncoder流的方法,因此需要了解OutputStreamWriter流的具體實(shí)現(xiàn)需要查看StreamEncoder流源碼才可知
到此這篇關(guān)于JAVA中的OutputStreamWriter流解析的文章就介紹到這了,更多相關(guān)OutputStreamWriter流解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-plus?代碼生成器?AutoGenerator?的簡介和使用詳解
AutoGenerator是MyBatis-Plus的代碼生成器,通過AutoGenerator可以快速生成?Entity、Mapper、Mapper XML、Service、Controller等各個(gè)模塊的代碼,極大的提升了開發(fā)效率,這篇文章主要介紹了Mybatis-plus代碼生成器AutoGenerator的簡介和使用,需要的朋友可以參考下2023-05-05java結(jié)合WebSphere MQ實(shí)現(xiàn)接收隊(duì)列文件功能
WebSphereMQ,也稱MQSeries,以一致的、可靠的和易于管理的方式來連接應(yīng)用程序,并為跨部門、企業(yè)范圍的集成提供了可靠的基礎(chǔ)。通過為重要的消息和事務(wù)提供可靠的、一次且僅一次的傳遞,MQ可以處理復(fù)雜的通信協(xié)議,并動(dòng)態(tài)地將消息傳遞工作負(fù)載分配給可用的資源。2015-10-10Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案
Java Web項(xiàng)目啟動(dòng)Tomcat時(shí)可能會(huì)遇到各種錯(cuò)誤,本文就來介紹一下Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Spring整合websocket整合應(yīng)用示例(下)
這篇文章主要介紹了Spring整合websocket整合應(yīng)用示例(下)的相關(guān)資料,需要的朋友可以參考下2016-04-04