InputStream和Reader,FileInputStream和 FileReader的区别
一、InputStream和Reader的區(qū)別
InputStream和Reader都可以用來讀數(shù)據(jù)(從文件中讀取數(shù)據(jù)或從Socket中讀取數(shù)據(jù)),最主要的區(qū)別如下:?
InputStream用來讀取二進制數(shù)(字節(jié)流),而?Reader用來讀取文本數(shù)據(jù),即?Unicode字符。那么二進制數(shù)與文本數(shù)據(jù)有什么區(qū)別呢?從本質(zhì)上來講,所有讀取的內(nèi)容都是字節(jié),要想把字節(jié)轉(zhuǎn)換為文本,需要指定一個編碼方法。而?Reader就可以把字節(jié)流進行編碼從而轉(zhuǎn)換為文本。當然,這個轉(zhuǎn)換過程就涉及編碼方式的問題,它默認采用系統(tǒng)默認的編碼方式對字節(jié)流進行編碼,也可以顯式地指定一個編碼方式,例如“UTF-8″。盡管這個概念非常簡單,但是Java程序員經(jīng)常會犯一些編碼的錯誤,最常見的錯誤就是不指定編碼方式。在讀文件或從?Socket讀取數(shù)據(jù)的時候,如果沒有指定正確的編碼方式,讀取到的數(shù)據(jù)可能就會有亂碼,進而導(dǎo)致數(shù)據(jù)丟失。
二、FileInputStream和?FileReader的區(qū)別
FileInputStream和?FileReader有著類似的區(qū)別,它們都用于從文件中讀取數(shù)據(jù),但是FileInputStream用于從文件中讀取二進制數(shù)據(jù)(字節(jié)流),而?FileReader用于從文件中讀取字符數(shù)據(jù)。
FileReader?繼承自?InputStreamReader,它要么使用系統(tǒng)默認的編碼方式,要么使用?InputStreamReader所使用的編碼方式。需要注意的是,?InputStreamReader緩存了字符編碼,因此,在創(chuàng)建?InputStreamReader對象以后,如果再對字符編碼進行修改將沒有任何作用。下面給出一個使用?Filelnputstream和FileReader的例子:
?
?
?程序的執(zhí)行結(jié)果為:
? ? ? ?
? ? ? ? ?7465737420726561642066696c65
? ? ? ? ?test read file
從上面的代碼可以看出,?FilelnputStream讀取數(shù)據(jù)的方式是一個字節(jié)一個字節(jié)地讀取,因此,讀取速度會比較慢,同時,read方法是一個阻塞方法,它要么讀取到一個字節(jié),要么阻塞(等待可被讀取的數(shù)據(jù)),這個方法的返回值為讀取到的字節(jié)數(shù),當讀取到文件結(jié)尾的時候,會返回-1。在使用FileInputStream的例子中,每個循環(huán)讀取一個字節(jié),然后轉(zhuǎn)換為十六進制字符串輸出。?FileReader?I中的read方法每次讀取一個字符,直到讀取到文件結(jié)尾時,這個方法返回-1。
?
上海尚學(xué)堂Java培訓(xùn)技術(shù)干貨之FileInputStream和?FileReader的區(qū)別就說明到此。更多Java技術(shù)知識文章請看本博客的其他文章,需要java學(xué)習(xí)資料視頻請留言評論。尚學(xué)堂Java全套詳細學(xué)習(xí)資料視頻和Python400集視頻以及程序員修煉手冊,干貨非常有。
轉(zhuǎn)載于:https://www.cnblogs.com/shsxt/p/9809645.html
總結(jié)
以上是生活随笔為你收集整理的InputStream和Reader,FileInputStream和 FileReader的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到蛇预示着什么数字
- 下一篇: 梦到自己吃樱桃是什么意思