[轉]Java FileInputStream與FileReader的區別

在解釋Java中FileInputStream和FileReader的具體區別以前,我想講述一下Java中InputStream和Reader的根本差別,以及分別何時使用InputStream和Reader。實際上, InputStream和Reader都是抽象類,並不直接地從文件或者套接字(socket)中讀取數據。然而,它們之間的主要差異在於:InputStream用於讀取二進制數據(字節流方式,譯者注),Reader用於讀取文本數據(字符流方式,譯者注),準確地說,Unicode字符。那麼,二進制數據和文本數據的區別是什麼呢?固然,全部讀取的東西本質上是字節,而後須要一套字符編碼方案,把字節轉換成文本。Reader類使用字符編碼來解碼字節,並返回字符給調用者。Reader類要麼使用運行Java程序平臺的默認字符編碼,要麼使用Charset對象或者String類型的字符編碼名稱,如「UTF-8」。儘管它是一個最簡單的概念,當讀取文本文件或從套接字中讀取文本數據時,不少Java開發者會因沒有指定字符編碼而犯錯。記住,若是你沒有指定正確的編碼,或者你的程序沒有使用的協議中已存在的字符編碼,如HTML的 「Content-Type(內容類型)」、XML文件頭指定的編碼,你可能沒法正確地讀取的全部數據。一些不是默認編碼呈現的字符,可能變成「?」或小方格。一旦你知道stream和reader之間的根本區別,理解FileInputStream和FileReader之間的差別就很容易了。既可讓你從文件中讀取數據,然而FileInputStream用於讀取二進制數據,FileReader用來讀取字符數據。html

Java中FileReader vs FileInputStream

因爲FileReader類繼承了InputStreamReader類,使用的字符編碼,要麼由類提供,要麼是平臺默認的字符編碼。請記住,InputStreamReader會緩存的字符編碼。建立對象後,設置字符編碼將不會有任何影響。讓咱們來看看如何使用Java中InputStream和FileReader的例子。你能夠提供任何一個文件對象或一個包含文件位置的字符串,以開始讀取文件的字符數據。這相似於FileInputStream,也提供了相似的用於讀取文件源的構造函數。儘管建議使用BufferedReader來讀取文件數據。java

 1 import java.awt.Color;
 2 import java.io.FileInputStream;
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5  
 6 /**
 7  * Java程序經過字節流和字符流的方式來讀取文件數據。
 8  * 需強調FileInputStream和FileReader的關鍵區別在於:FileReader用於讀取字符流,而FileInputStream用來讀取原始字節流。
 9  * @author Javin Paul
10  */
11 public class HowToReadFileInJava {
12     public static void main(String args[]) {
13  
14         // 例1 – 使用FileInputStream 讀取文件內容
15         try (FileInputStream fis = new FileInputStream("data.txt")) {
16             int data = fis.read();
17             while (data != -1) {
18                 System.out.print(Integer.toHexString(data));
19                 data = fis.read();
20             }
21         } catch (IOException e) {
22             System.out.println("Failed to read binary data from File");
23             e.printStackTrace();
24         }
25  
26         // 例2 – Java中使用FileReader 讀取文件數據
27         try (FileReader reader = new FileReader("data.txt")) {
28             int character = reader.read();
29             while (character != -1) {
30                 System.out.print((char) character);
31                 character = reader.read();
32             }
33         } catch (IOException io) {
34             System.out.println("Failed to read character data from File");
35             io.printStackTrace();
36         }
37     }
38 }

輸出:數組

1 4157532d416d617a6f6e205765622053657276696365da474f4f472d476f6f676c65da4150504c2d4170706c65da47532d476f6c646d616e205361636873
2 AWS-Amazon Web Service
3 GOOG-Google
4 APPL-Apple
5 GS-Goldman Sachs

第1個例子是按字節從文件中讀取數據,所以勢必會很是慢。FileInputStream的read() 方法是阻塞式的,讀取字節或數據塊,直到無數據輸入。它要麼返回數據的下一個字節,當到達文件末尾時,返回-1。這意味着,咱們每循環讀取一個字節,將其打印爲十六進制字符串。順便說一句,將InputStream轉換成字節數組是可選的。另外一方面,例2是按字符讀取數據。繼承自FileReader的InputStreamReader 的read() 方法讀取單個字符,並返回該字符,當到達流末尾時,返回-1。這就是爲何你看到例2輸出的文字跟文件中的徹底同樣。緩存

這就是全部關於Java中FileInputStream和FileReader之間的區別。歸根結底:使用FileReader或BufferedReader從文件中讀取字符或文本數據,並老是指定字符編碼;使用FileInputStream從Java中文件或套接字中讀取原始字節流。socket

 

原文連接: javarevisited 翻譯: ImportNew.com era_misa
譯文連接: http://www.importnew.com/11537.html
轉載請保留原文出處、譯者和譯文連接。]函數

相關文章
相關標籤/搜索