您好,登錄后才能下訂單哦!
如何理解Java 字節(jié)流與字符流,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
下面我們開(kāi)始今天的內(nèi)容。
字節(jié)流和字符流其實(shí)很好理解!
字節(jié)流就是 Byte 流,字節(jié)就是 Byte。
字符流就是 Character 流,字符就是 Character。
這里面有兩個(gè)單位換算大家需要記住一下。
1 byte = 8 bit
1 char = 2 byte = 16 bit
雖然 1 bit 才是數(shù)據(jù)真正的最小單位,但 1 bit 的信息量太少了。要表示一個(gè)有用的信息,需要好幾個(gè) bit 一起表示。所以大多數(shù)情況下,字節(jié)是數(shù)據(jù)最小的基本單位。
比如,我們熟知的基本型的大小都是 8 bit(也就是1字節(jié))的整數(shù)倍:
boolean: 1 byte
short: 2 byte
int: 4 byte
float: 4 byte
long: 8 byte
double: 8 byte
到這里,我們認(rèn)識(shí)的都是字節(jié)。但是,Java I/O 的編碼系統(tǒng)提供的 Java IO 庫(kù)有兩個(gè)支系,面向字節(jié)流的 InputStream 和 OutputStream;面向字符的 Reader 和 Writer。
為什么要有字符流呢?那是因?yàn)橛⑽?,我們可以用字?jié)來(lái)表示,但是中文、日文、韓文等沒(méi)法用字節(jié)來(lái)表示了,所有人們就想到了新的字符編碼集。比如,Unicode 字符集,GB 18030,GBK,Big5,ISO-8859-1 等。
所以,最終就是一個(gè)字符用 1 個(gè)、2 個(gè)或 4 個(gè)字節(jié)組成。總而言之,一切都是字節(jié)流,其實(shí)沒(méi)有字符流這個(gè)東西。字符只是根據(jù)編碼集對(duì)字節(jié)流翻譯之后的產(chǎn)物。
所以,字節(jié)流的 InputStream 和 OutputStream 才是一切的基礎(chǔ)。實(shí)際總線中流動(dòng)的只有字節(jié)流。需要對(duì)字節(jié)流做特殊解碼才能得到字符流。Java 中負(fù)責(zé)從字節(jié)流向字符流解碼的橋梁是InputStreamReader 和 InputStreamWriter。
看下面的 InputStreamReader 和 OutputStreamWriter 的結(jié)構(gòu)圖。
實(shí)際負(fù)責(zé)編碼和解碼的是 StreamDecoder 類和 StreamEncoder 類。編碼過(guò)程中必須指定使用的字符編碼集 Charset。所以 InputStreamReader 和 OutputStreamWriter 的構(gòu)造器都帶有 Charset 類型的參數(shù)。
如果沒(méi)有指定編碼集,將使用系統(tǒng)默認(rèn)編碼集。而我們經(jīng)常使用的 FileInputReader 和 FileOutputWriter 就是 InputStreamReader 和 OutputStreamWriter 的派生類。
計(jì)算機(jī)中本沒(méi)有字符流,一開(kāi)始只適用于英文,但是互聯(lián)網(wǎng)屬于全人類的,所以人們又搞出了字符流。字符只是包裝的字節(jié)而已。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。