Java中提供了專用于輸入輸出功能的包Java.io,其中包括: InputStream,OutputStream,Reader,Writer InputStream 和OutputStream,兩個(gè)是為字節(jié)流設(shè)計(jì)的,主要用來處理字節(jié)或二進(jìn)制對(duì)象, Reader和 Writer.兩個(gè)是為字符流(一個(gè)字符占兩個(gè)字節(jié))設(shè)計(jì)的,主要用來處理字符或字符串.
字符流處理的單元為2個(gè)字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串,而字節(jié)流處理單元為1個(gè)字節(jié),操作字節(jié)和字節(jié)數(shù)組。所以字符流是由Java虛擬機(jī)將字節(jié)轉(zhuǎn)化為2個(gè)字節(jié)的Unicode字符為單位的字符而成的,所以它對(duì)多國(guó)語言支持性比較好!如果是音頻文件、圖片、歌曲,就用字節(jié)流好點(diǎn),如果是關(guān)系到中文(文本)的,用字符流好點(diǎn) 所有文件的儲(chǔ)存是都是字節(jié)(byte)的儲(chǔ)存,在磁盤上保留的并不是文件的字符而是先把字符編碼成字節(jié),再儲(chǔ)存這些字節(jié)到磁盤。在讀取文件(特別是文本文件)時(shí),也是一個(gè)字節(jié)一個(gè)字節(jié)地讀取以形成字節(jié)序列
字節(jié)流可用于任何類型的對(duì)象,包括二進(jìn)制對(duì)象,而字符流只能處理字符或者字符串; 2. 字節(jié)流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以 字節(jié)流是最基本的,所有的InputStrem和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù),它是按字節(jié)來處理的 但實(shí)際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機(jī)的encode來處理,也就是要進(jìn)行字符集的轉(zhuǎn)化 這兩個(gè)之間通過 InputStreamReader,OutputStreamWriter來關(guān)聯(lián),實(shí)際上是通過byte[]和String來關(guān)聯(lián) 在實(shí)際開發(fā)中出現(xiàn)的漢字問題實(shí)際上都是在字符流和字節(jié)流之間轉(zhuǎn)化不統(tǒng)一而造成的
==================我們還可以看到:============ Reader類的read()方法返回類型為int :作為整數(shù)讀取的字符(占兩個(gè)字節(jié)共16位),范圍在 0 到 65535 之間 (0x00-0xffff),如果已到達(dá)流的末尾,則返回 -1
inputStream的read()雖然也返回int,但由于此類是面向字節(jié)流的,一個(gè)字節(jié)占8個(gè)位,所以返回 0 到 255 范圍內(nèi)的 int 字節(jié)值。如果因?yàn)橐呀?jīng)到達(dá)流末尾而沒有可用的字節(jié),則返回值 -1。因此對(duì)于不能用0-255來表示的值就得用字符流來讀?。”热缯f漢字...至此,有些人可能就會(huì)產(chǎn)生一個(gè)問題:既然返回結(jié)果只能在0-255之間的值,那何返回byte型的呢? 這個(gè)問題提得很好,我先頂你一下~~~也就是說一個(gè)int占4個(gè)字節(jié),而返回結(jié)果只是在0-255(2的8次方-1)之間,只占1個(gè)字節(jié),這就說明返回結(jié)果只占掉int的低8位!其實(shí)是這樣的: read()有個(gè)約定,就是達(dá)到流的結(jié)尾時(shí)返回-1 ,而byte型的范圍是0-255(沒有負(fù)數(shù))。因此-1會(huì)被表示成255!這樣,如果返回類型是byte,那么255究竟是代表 結(jié)束 還是代表 讀到的byte值 呢? 顯然無法區(qū)分!
補(bǔ)充:java.nio.*包中的ByteBuffer 用get()來完成類似于read()的功能,不過get方法返回的是byte。
|