InputStream和Reader均可以用來讀數據(從文件中讀取數據或從Socket中讀取數據),最主要的區別以下:
InputStream用來讀取二進制數(字節流),而 Reader用來讀取文本數據,即 Unicode字符。那麼二進制數與文本數據有什麼區別呢?從本質上來說,全部讀取的內容都是字節,要想把字節轉換爲文本,須要指定一個編碼方法。而 Reader就能夠把字節流進行編碼從而轉換爲文本。固然,這個轉換過程就涉及編碼方式的問題,它默認採用系統默認的編碼方式對字節流進行編碼,也能夠顯式地指定一個編碼方式,例如「UTF-8″。儘管這個概念很是簡單,可是Java程序員常常會犯一些編碼的錯誤,最多見的錯誤就是不指定編碼方式。在讀文件或從 Socket讀取數據的時候,若是沒有指定正確的編碼方式,讀取到的數據可能就會有亂碼,進而致使數據丟失。
java
FileInputStream和 FileReader有着相似的區別,它們都用於從文件中讀取數據,可是FileInputStream用於從文件中讀取二進制數據(字節流),而 FileReader用於從文件中讀取字符數據。
FileReader 繼承自 InputStreamReader,它要麼使用系統默認的編碼方式,要麼使用 InputStreamReader所使用的編碼方式。須要注意的是, InputStreamReader緩存了字符編碼,所以,在建立 InputStreamReader對象之後,若是再對字符編碼進行修改將沒有任何做用。下面給出一個使用 Filelnputstream和FileReader的例子:程序員
程序的執行結果爲:
7465737420726561642066696c65
test read file
從上面的代碼能夠看出, FilelnputStream讀取數據的方式是一個字節一個字節地讀取,所以,讀取速度會比較慢,同時,read方法是一個阻塞方法,它要麼讀取到一個字節,要麼阻塞(等待可被讀取的數據),這個方法的返回值爲讀取到的字節數,當讀取到文件結尾的時候,會返回-1。在使用FileInputStream的例子中,每一個循環讀取一個字節,而後轉換爲十六進制字符串輸出。 FileReader I中的read方法每次讀取一個字符,直到讀取到文件結尾時,這個方法返回-1。
上海尚學堂Java培訓技術乾貨之FileInputStream和 FileReader的區別就說明到此。更多Java技術知識文章請看本博客的其餘文章,須要java學習資料視頻請留言評論。尚學堂Java全套詳細學習資料視頻和Python400集視頻以及程序員修煉手冊,乾貨很是有。緩存