一、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集視頻以及程序員修煉手冊,干貨非常有。