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