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