2016-02-04 18 views
2

我讀到InputStream用於基於字節的讀取,它一次讀取1個字節。 InputStreamReader用於基於字符的讀取,因此它一次讀取一個字符,因此不需要先將其轉換爲int,然後再讀取它。java中的InputStream和InputStreamReader之間的區別

這裏是使用InputStream進行讀取。

InputStream input=new FileInputStream("D:/input.txt"); 

int c; 

while((c=input.read())!=-1) 
{ 
    System.out.print((char)c); 
} 

這裏使用的InputStreamReader

InputStream input=new FileInputStream("D:/input.txt"); 

reader=new InputStreamReader(input,"UTF-8"); 

int c; 

while((c=reader.read())!=-1) 
{ 
    System.out.print((char)c); 
} 

是什麼InputStreamInputStreamReader區別讀書?在這兩種情況下,我必須使用int然後閱讀它,最後如果我想打印那些數據,我必須使用「(char)c」進行轉換。

那麼使用InputStreamReader有什麼好處呢?

+0

不同之處在於'InputStream'本身不會處理大於127的輸入值。嘗試在測試輸入中添加一些中文字符,它們將使用'InputStream'版本打印爲兩個字節。 – markspace

回答

6

什麼是InputStreamInputStreamReader有很大的區別。一個讀取字節,而另一個讀取字符。根據使用的編碼,一個字符可能超過1個字節。

InputStream.read()

中讀取數據的從輸入流

下一個字節從InputStreamReader.read()

讀取單個字符。

InputStreamReader充當在Java中讀取數據的兩種方式之間的橋樑:一種將字節流與字符流橋接的方式。 From its Javadoc

一個InputStreamReader是從字節流以字符流的橋樑:它讀取字節並將其解碼成使用指定的charset字符。它使用的字符集可以用名字指定,也可以明確給出,或者可以接受平臺的默認字符集。

每個調用InputStreamReaderread()方法之一可能會導致從底層字節輸入流中讀取一個或多個字節。爲了能夠有效地將字節轉換爲字符,可以從基礎流中讀取比滿足當前讀取操作所需的字節更多的字節。

+0

感謝您的回答,但如果是這種情況,那麼爲什麼兩個返回相同的輸出。 使用System.out.println(c)顯示輸出時,我得到了相同的輸出。 你能舉出任何例子,以便我可以看到實際差異。 – user3387084

+0

@ user3387084嘗試閱讀中文文本;),你會看到不同之處。 – Tunaki

+0

Thanks @ user3387084,所以基本上InputStreamReader應該用於像「UTF-16」這樣的編碼。對 ? – user3387084

0

一些編碼具有跨越多個字節的字符。通過使用InputStream讀取,您可能會愚蠢地讀取下一個字節,而不是InputStreamReader,它可能會根據需要預讀,以便爲您提供下一個字符而不是字節。換句話說,假設你有0x00 0xA7作爲流的後續兩個字節。 InputStream會在第一次讀取時給你0x0,然後在下一次給出0xA7。使用unicode編碼的InputStreamReader將在第一次讀取時返回0x00A7,這是字符§。

請注意,如果在大多數情況下將InputStreamReader與BufferedReader封裝在一起可能是最好的。

0

一個InputStream通常總是連接到某些數據源,如文件,網絡連接,管道等。這也在Java IO概述文本中有更詳細的解釋。

InputStreamReader將讀取輸入流並將字節串轉換爲字符。例如,某些UTF字符是2個字節,對輸入流讀取器的調用將讀取兩個字節並自動將其轉換爲字符。它用於讀取文本流。

0

對於InputStreamReader,您可以使用'char c'來代替'int c'而不是'-1'值,您可以使用'null'。像這樣:

InputStream input=new FileInputStream("D:/input.txt"); 

reader=new InputStreamReader(input,"UTF-8"); 

char c; 

while((c=reader.read())!=null) 
{ 
System.out.print(c); 
} 

因爲您正在使用InputStreamReader做基於字符的閱讀。 因此,不需要設置數據類型'int',然後使用'char'來強制轉換,這是不必要的。 我們需要在InputStream的情況下執行此操作,因爲它基於字節讀取。

相關問題