1. 程式人生 > >InputStream 、OutputStream、 InputStreamReader 、OutputStreamWriter、 BufferedReader、BufferedWriter的區別

InputStream 、OutputStream、 InputStreamReader 、OutputStreamWriter、 BufferedReader、BufferedWriter的區別

1、InputStream、OutputStream區別

      1.1)InputStream:是表示輸入位元組流所有類的超類,一般我們使用它的子類,如FileInputStream等.

    1. 2)OutputStream:表示輸出位元組流所有類的超類。輸出流接受輸出位元組並將它們傳送到某個接收器。一般我們使用它的子類,如FileOutputStream等.

2、InputStreamReader  、OutputStreamWriter區別

2.1)InputStreamReader :InputStreamReader是從位元組流到字元流的橋接器:它讀取位元組並使用指定的字元將它們解碼為字元

charset。它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的預設字符集。每次呼叫一個InputStreamReader的read()方法都可能導致從底層位元組輸入流中讀取一個或多個位元組。

為了實現位元組到字元的有效轉換,可以從基礎流中提取比滿足當前讀取操作所需的更多位元組。為了獲得最高效率,考慮在BufferedReader中包裝InputStreamReader。

例如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

2.2)OutputStreamWriter

:OutputStreamWriter是從字元流到位元組流的橋接:寫入它的字元使用指定的位元組編碼為位元組charset。它使用的字符集可以通過名稱指定,也可以明確指定,或者可以接受平臺的預設字符集。

每次呼叫write()方法都會導致在給定字元上呼叫編碼轉換器。生成的位元組在寫入底層輸出流之前在緩衝區中累積。可以指定此緩衝區的大小,但預設情況下,它足夠大,可用於大多數用途。請注意,傳遞給write()方法的字元不會被緩衝。為了獲得最高效率,請考慮在BufferedWriter中包裝OutputStreamWriter,以避免頻繁的轉換器呼叫

例如: Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

3、BufferedReader 、BufferedWriter

3.1)BufferedReader :從字元輸入流中讀取文字,緩衝字元,以便有效地讀取字元,陣列和行。

可以指定緩衝區大小,或者可以使用預設大小。對於大多數用途,預設值足夠大。

通常,有Reader構成的每個讀取請求都會導致相應的讀取請求有基礎字元火位元組流構成,因此,建議將BufferReader包裝在任何read()操作可能代價較為高昂的Reader上,例如FileReaders、InputStreamReaders。

例如:BufferedReader in = new BufferedReader(new FileReader(“foo.in”));

將緩衝指定檔案的輸入,如果沒有緩衝mread() 或readerLine()  的每次呼叫都可能導致從檔案中讀取位元組,轉換為字元,然後返回,非常抵消,

3.2)BufferedWriter:將文字寫入字元輸入流,緩衝字元,以便地寫入單個字元,數字和字串。

可以指定緩衝區大小,或者可以接受預設大小,對於大多數用途,預設值足夠用了

提供了一個newLine()方法,它使用平臺自的分行隔符概念。並非所有的平臺都是用換行符  “\n”  來終止行,因此,呼叫此方法終止輸出行比直接寫換行符更為可取。通常,Writer會立即將其輸出傳送到基礎字元或位元組流,除非需要提示輸出,否則將BufferedWriter包裝在任何write() 操作可能代價高昂的Writer周圍

例如:PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

將PrintWriter的輸出緩衝到檔案,如果沒有緩衝,每次呼叫print()  方法都會導致字元轉換為位元組,然後立即寫入檔案,但效率很低