2010-07-07 75 views
45

使用InputStream而不是InputStreamReader有什麼好處,反之亦然。InputStream vs InputStreamReader

這裏是InputStream在行動的例子:

InputStream input = new FileInputStream("c:\\data\\input-text.txt"); 

int data = input.read(); 
while(data != -1) { 
    //do something with data... 
    doSomethingWithData(data); 

    data = input.read(); 
} 
input.close(); 

這裏是使用InputStreamReader的(很明顯,InputStream的幫助下)的例子:

InputStream inputStream = new FileInputStream("c:\\data\\input.txt"); 
Reader  reader  = new InputStreamReader(inputStream); 

int data = reader.read(); 
while(data != -1){ 
    char theChar = (char) data; 
    data = reader.read(); 
} 

reader.close(); 

是否閱讀過程中的數據以特殊的方式?

只是試圖讓我的頭在整個i/o在Java流數據方面。

+2

注意它通常是一個好主意,構建'InputStreamReader'時指定字符集編碼。如果你把它放在外面,那麼它會選擇正確配置的任何編碼(如果這就是你想要的,然後寫明確)。 – 2010-07-07 13:14:37

回答

73

它們代表有些不同的東西。

InputStream是父類中的所有可能的流字節,它本身不是有用的,但所有的子類(比如您正在使用的FileInputStream)是偉大的處理二進制數據。

對方InputStreamReader(及其父Reader)專門用於處理字符(所以字符串),因此他們適當地處理字符集編碼(utf8,iso-8859-1等)。

簡單的回答是:如果你需要二進制數據,你可以使用一個InputStream(也有特定的一個像DataInputStream),如果你需要處理文本使用InputStreamReader ..

5

如果要使用InputStream讀取二進制數據。

如果要從二進制流中讀取字符串,請使用InputStreamReader。它的一個構造函數允許你指定一個字符集。

因此,不要使用FileReader,因爲它使用字符集的平臺默認值,這在很多情況下是不實用的。

26

InputStreamReader用於直接讀取字符。

因此,將它們讀爲int,然後轉換爲char不是最佳選擇。

這是我相信的主要區別。

InputStream給你的字節,而InputStreamReader給你已經是字符,所以它一次讀取8位。此外,如果您正在閱讀大塊文本,您甚至可以將InputStreamReader包裝在BufferedReader中,該文件爲您提供了一些不錯的方法,讓我們可以一次讀取整條線。

這幫你嗎?

您還可以閱讀這篇文章:https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

乾杯,

+0

是的,這是有道理的。 有沒有一種方法來指定一個緩衝區,以便它一次讀取多於1個字節 - 比如我希望它一次讀取1024個字節。 – xil3 2010-07-07 13:14:02

+0

嗨, 那麼如果你使用BufferedReader,你可以根據Javadoc「BufferedReader(Reader in,int sz)」來定義Buffer的大小。但是,對於InputStreamReader,我相信這一次只能準備好1個字節。你不能改變這一點。 – Trefex 2010-07-07 13:19:20

+0

好的,謝謝:) – xil3 2010-07-07 13:20:59

9

從InputStreamReader中的Javadoc:

一種用於把一個字節流進入 字符流類。從 源輸入流中讀取的數據通過默認或 提供的字符轉換器轉換爲 個字符。默認編碼是 「file.encoding」系統屬性。 {@code InputStreamReader}包含從源 流中讀取的 字節緩衝區,並根據需要將它們轉換爲 個字符。

對於InputStreams,實際上包含已知編碼中的字符,請使用reader。否則,你只需要獲取字節,並且必須手動轉換爲char'。

兩個read方法之間的區別在於:

InputStream::read讀取單個byte並將其返回作爲intInputStreamReader::read讀取單個char(尊重編碼),並返回以此爲int

1

InputstreamReader用於讀取輸入流中無法讀取的Unicode數據。

1

的InputStream幫助我們讀字節流
InputStreamReader的幫助那些解碼字節流成使用一些字符集如UTF-8或其他字符流。
更多效率的Java API建議與的InputStream也隨之使用的BufferedReader的InputStreamReader