字節流:
(A)FileOutputStream(File name) 創建一個文件輸出流,向指定的 File 對象輸出數據。
(B)FileOutputStream(FileDescriptor) 創建一個文件輸出流,向指定的文件描述器輸出數據。
(C)FileOutputStream(String name) 創建一個文件輸出流,向指定名稱的文件輸出數據。
(D)FileOutputStream(String, boolean) 用指定系統的文件名,創建一個輸出文件。
字符流:
InputStreamReader 和 OutputStreamReader :
把一個以字節為導向的 stream 轉換成一個以字符為導向的 stream 。
InputStreamReader 類是從字節流到字符流的橋梁:它讀入字節,並根據指定的編碼方式,將之轉換為字符流。
使用的編碼方式可能由名稱指定,或平台可接受的缺省編碼方式。
InputStreamReader 的 read() 方法之一的每次調用,可能促使從基本字節輸入流中讀取一個或多個字節。
為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader ,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
相同點:
InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new
字節流與字符流的區別
字節流和字符流使用是非常相似的,那么除了操作代碼的不同之外,還有哪些不同呢?
區別:
1、字節流在操作的時候本身是不會用到緩沖區(內存)的,是與文件本身直接操作的,而字符流在操作的時候是使用到緩沖區的
2、字節流在操作文件時,即使不關閉資源(close方法),文件也能輸出,但是如果字符流不使用close方法的話,則不會輸出任何內容,說明字符流用的是緩沖區,並且可以使用flush方法強制進行刷新緩沖區,這時才能在不close的情況下輸出內容
3、Reader類的read()方法返回類型為int :作為整數讀取的字符(占兩個字節共16位),范圍在 0 到 65535 之間 (0x00-0xffff),如果已到達流的末尾,則返回 -1
inputStream的read()雖然也返回int,但由於此類是面向字節流的,一個字節占8個位,所以返回 0 到 255 范圍內的 int 字節值。如果因為已經到達流末尾而沒有可用的字節,則返回值 -1。因此對於不能用0-255來表示的值就得用字符流來讀取!比如說漢字.
4、字節流與字符流主要的區別是他們的的處理方式
字節流:處理字節和字節數組或二進制對象;
字符流:處理字符、字符數組或字符串。
那開發中究竟用字節流好還是用字符流好呢?
一、字符(Reader和 Writer):中文,字符是只有在內存中才會形成的,操作字符、字符數組或字符串,
二、字節(InputStream 和OutputStream):音頻文件、圖片、歌曲,所有的硬盤上保存文件或進行傳輸的時候,操作字節和字節數組或二進制對象,
*如果要java程序實現一個拷貝功能,應該選用字節流進行操作(可能拷貝的是圖片),並且采用邊讀邊寫的方式(節省內存)。
***
**緩沖區
緩沖區可以簡單地理解為一段內存區域。
可以簡單地把緩沖區理解為一段特殊的內存。
某些情況下,如果一個程序頻繁地操作一個資源(如文件或數據庫),則性能會很低,此時為了提升性能,就可以將一部分數據暫時讀入到內存的一塊區域之中,以后直接從此區域中讀取數據即可,因為讀取內存速度會比較快,這樣可以提升程序的性能。
在字符流的操作中,所有的字符都是在內存中形成的,在輸出前會將所有的內容暫時保存在內存之中,所以使用了緩沖區暫存數據。
如果想在不關閉時也可以將字符流的內容全部輸出,則可以使用Writer類中的flush()方法完成。