InputStream和Reader,FileInputStream和 FileReader的區別
一、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。
上海