一、InputStream和Reader的區別
InputStream和Reader都可以用來讀數據(從文件中讀取數據或從Socket中讀取數據),最主要的區別如下:?
InputStream用來讀取二進制數(字節流),而?Reader用來讀取文本數據,即?Unicode字符。那么二進制數與文本數據有什么區別呢?從本質上來講,所有讀取的內容都是字節,要想把字節轉換為文本,需要指定一個編碼方法。而?Reader就可以把字節流進行編碼從而轉換為文本。當然,這個轉換過程就涉及編碼方式的問題,它默認采用系統默認的編碼方式對字節流進行編碼,也可以顯式地指定一個編碼方式,例如“UTF-8″。盡管這個概念非常簡單,但是Java程序員經常會犯一些編碼的錯誤,最常見的錯誤就是不指定編碼方式。在讀文件或從?Socket讀取數據的時候,如果沒有指定正確的編碼方式,讀取到的數據可能就會有亂碼,進而導致數據丟失。
二、FileInputStream和?FileReader的區別
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集視頻以及程序員修煉手冊,干貨非常有。