最近在學(xué)習(xí)java中的字節(jié)流和字符流,而又有轉(zhuǎn)換流,為什么還要有轉(zhuǎn)換流呢?首先先來看一下字節(jié)流和字符流。
字節(jié)流:
讀取操作: InputStream(子類FileInputStream)------read()
可用BufferedInputStream提高效率(緩沖字節(jié)流)
寫入操作:OutputStream(子類FileOutputStream)---write()
可用BufferedOutputStream提高效率(緩沖字節(jié)流)
字符流:
讀取操作:Reader(InputStreamReader、FileReader)--------read()
可用BufferedReader提高效率(緩沖字節(jié)流)
寫入操作:Writer(OutputStreamWriter、FileWriter)---------write()
可用BufferedWriter提高效率(緩沖字節(jié)流)
正常情況下,我們用字節(jié)流可以對所有的數(shù)據(jù)進(jìn)行操作,但是有些時(shí)候我們在處理一些文本時(shí)我們要用到字符流,比如,查看文本中的中文時(shí)就是需要采用字符流,更為方便。如,在記事本中輸入“中國”兩個(gè)漢字,存儲格式為“UTF-8”,通過字節(jié)流方式讀取,讀到的內(nèi)容我們看不懂。

由此看出,通過字節(jié)流很難得到我們能看的懂得文本內(nèi)容,換句話說也就是很難正確解碼。

我們用字節(jié)數(shù)組,并通過字符串設(shè)定編碼格式來顯示內(nèi)容,此時(shí)得到的使我們能看得懂的內(nèi)容,但是a.txt中的內(nèi)容較少,當(dāng)較多時(shí),而在1024的整倍數(shù)處又會出現(xiàn)解碼不正確的問題,字節(jié)數(shù)組長度無法根據(jù)解碼內(nèi)容自動設(shè)定,此時(shí)就需要轉(zhuǎn)換流來完成解碼任務(wù)。
所謂的解碼,實(shí)際上就是將我們看不懂的數(shù)據(jù)格式(按照一定的規(guī)則,編碼表)轉(zhuǎn)換成我們能夠看得懂的內(nèi)容,即,二進(jìn)制數(shù)據(jù)------字符;對應(yīng)的編碼就是將看得懂的轉(zhuǎn)換成看不懂的,字符-----二進(jìn)制數(shù)據(jù)。
所以,字符流 = 字節(jié)流 + 編碼表
下面的是一些常見的編碼表的介紹:
計(jì)算機(jī)只能識別二進(jìn)制數(shù)據(jù),早期由來是電信號。為了方便應(yīng)用計(jì)算機(jī),讓它可以識別各個(gè)國家的文字。就將各個(gè)國家的文字用數(shù)字來表示,并一一對應(yīng),形成一張表。
ASCII:美國標(biāo)準(zhǔn)信息交換碼。
用一個(gè)字節(jié)的7位可以表示。
ISO8859-1:拉丁碼表。歐洲碼表
用一個(gè)字節(jié)的8位表示。
GB2312:中國的中文編碼表。
GBK:中國的中文編碼表升級,融合了更多的中文文字符號。
GB18030:GBK的取代版本
BIG-5碼:通行于臺灣、香港地區(qū)的一個(gè)繁體字編碼方案,俗稱“大五碼”。
Unicode:國際標(biāo)準(zhǔn)碼,融合了多種文字。
所有文字都用兩個(gè)字節(jié)來表示,Java語言使用的就是unicode
UTF-8:最多用三個(gè)字節(jié)來表示一個(gè)字符。
UTF-8不同,它定義了一種“區(qū)間規(guī)則”,這種規(guī)則可以和ASCII編碼保持最大程度的兼容:
它將Unicode編碼為00000000-0000007F的字符,用單個(gè)字節(jié)來表示它將Unicode編碼為00000080-000007FF的字符用兩個(gè)字節(jié)表示 它將Unicode編碼為00000800-0000FFFF的字符用3字節(jié)表示
轉(zhuǎn)換流中,InputStreamReader和OutputStreamWriter是字節(jié)流和字符流轉(zhuǎn)換的橋梁,那什么時(shí)候使用呢 ?
1.當(dāng)字節(jié)和符之間有轉(zhuǎn)換動作時(shí) 2。流操作的數(shù)據(jù)需要進(jìn)行編碼表指定時(shí)。
以讀取操作為例:采用轉(zhuǎn)換流在此讀取上面的文本InputStreamReader(InputStream is):用默認(rèn)的編碼讀取數(shù)據(jù);InputStreamReader(InputStream is,StringcharsetName):用指定的編碼讀取數(shù)據(jù)

咦,采用了轉(zhuǎn)換流讀取了,怎么還是看不懂?InputStreamReader(InputStream is):用默認(rèn)的編碼讀取數(shù)據(jù);在Eclipse下,默認(rèn)的編碼格式是系統(tǒng)系統(tǒng)的編碼格式:GBK,并沒有對應(yīng)上a.txt所采用的編碼格式;需要手動指定編碼格式InputStreamReader(InputStream is,String charsetName):用指定的編碼讀取數(shù)據(jù)

這次就正確了,當(dāng)然讀取的方式還有其他的read方法,可以參照J(rèn)Dk查看,還有寫入數(shù)據(jù)時(shí)的編碼
OutputStreamWriter(OutputStream os):默認(rèn)編碼寫數(shù)據(jù),GBK
OutputStreamWriter(OutputStream os,StringcharsetName):指定編碼寫數(shù)據(jù)
要想不出現(xiàn)編碼與解碼的問題,就要保證編碼時(shí)和解碼時(shí)采用相同的編碼表,而對于一般的本地操作常用的是FileWriter和FilewReader兩個(gè)類,操作更為方便,采用默認(rèn)的編碼表,,一旦需要自己設(shè)定編碼格式,就需要采用InputStreamReader,OutputStreamWriter。
|
新聞熱點(diǎn)
疑難解答
圖片精選