字節流與字符流的區別&&用字節流好仍是用字符流好?

 

字節流java

(A)FileOutputStream(File name) 建立一個文件輸出流,向指定的 File 對象輸出數據。數據庫

(B)FileOutputStream(FileDescriptor) 建立一個文件輸出流,向指定的文件描述器輸出數據。數組

(C)FileOutputStream(String name) 建立一個文件輸出流,向指定名稱的文件輸出數據。性能

(D)FileOutputStream(String, boolean) 用指定系統的文件名,建立一個輸出文件。編碼

字符流spa

 

InputStreamReader 和 OutputStreamReader :對象

把一個以字節爲導向的 stream 轉換成一個以字符爲導向的 stream 。blog

InputStreamReader 類是從字節流到字符流的橋樑:它讀入字節,並根據指定的編碼方式,將之轉換爲字符流。圖片

使用的編碼方式可能由名稱指定,或平臺可接受的缺省編碼方式。ip

InputStreamReader 的 read() 方法之一的每次調用,可能促使從基本字節輸入流中讀取一個或多個字節。

爲了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader ,

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

相同點:

InputStream,OutputStream,Reader,writer都是抽象類。因此不能直接new 

字節流與字符流的區別

字節流和字符流使用是很是類似的,那麼除了操做代碼的不一樣以外,還有哪些不一樣呢?

區別:

一、字節流在操做的時候自己是不會用到緩衝區(內存)的,是與文件自己直接操做的,而字符流在操做的時候是使用到緩衝區的

二、字節流在操做文件時,即便不關閉資源(close方法),文件也能輸出,可是若是字符流不使用close方法的話,則不會輸出任何內容,說明字符流用的是緩衝區,而且可使用flush方法強制進行刷新緩衝區,這時才能在不close的狀況下輸出內容

三、Reader類的read()方法返回類型爲int :做爲整數讀取的字符(佔兩個字節共16位),範圍在 0 到 65535 之間 (0x00-0xffff),若是已到達流的末尾,則返回 -1
inputStream的read()雖然也返回int,但因爲此類是面向字節流的,一個字節佔8個位,因此返回 0 到 255 範圍內的 int 字節值。若是由於已經到達流末尾而沒有可用的字節,則返回值 -1。所以對於不能用0-255來表示的值就得用字符流來讀取!好比說漢字.

四、字節流與字符流主要的區別是他們的的處理方式

字節流:處理字節和字節數組或二進制對象;

字符流:處理字符、字符數組或字符串。

那開發中究竟用字節流好仍是用字符流好呢?

1、字符(Reader和 Writer):中文,字符是隻有在內存中才會造成的,操做字符、字符數組或字符串,

2、字節(InputStream 和OutputStream):音頻文件、圖片、歌曲,全部的硬盤上保存文件或進行傳輸的時候,操做字節和字節數組或二進制對象,

*若是要java程序實現一個拷貝功能,應該選用字節流進行操做(可能拷貝的是圖片),而且採用邊讀邊寫的方式(節省內存)。

***

**緩衝區

緩衝區能夠簡單地理解爲一段內存區域。
能夠簡單地把緩衝區理解爲一段特殊的內存。
某些狀況下,若是一個程序頻繁地操做一個資源(如文件或數據庫),則性能會很低,此時爲了提高性能,就能夠將一部分數據暫時讀入到內存的一塊區域之中,之後直接今後區域中讀取數據便可,由於讀取內存速度會比較快,這樣能夠提高程序的性能。
在字符流的操做中,全部的字符都是在內存中造成的,在輸出前會將全部的內容暫時保存在內存之中,因此使用了緩衝區暫存數據。
若是想在不關閉時也能夠將字符流的內容所有輸出,則可使用Writer類中的flush()方法完成。

相關文章
相關標籤/搜索