2012-02-27 35 views
1

我知道正確的做法是是否可以使用FileReader從文件讀取?

BufferedReader br = new BufferedReader(FileReader(file)); 

,但我在Java API檢查的FileReader類的方法,它有一個read()方法返回讀取的字符。但它不適合我。我正在讀取包含這行文本的文件:「正在讀取文件」並將其打印到屏幕上,但是當我運行程序時,它會爲每個字符打印相應的ASCII碼。

這是我的代碼:

String lectura = ""; 
try{ 
    lectura = String.valueOf(fr.read()); 
} catch(IOException ioex){ 
    ioex.printStackTrace(); 
} 

while((Integer.parseInt(lectura)) != -1){ 
    System.out.print(lectura); 
    try{ 
     lectura = String.valueOf(fr.read()); 
    } catch(IOException ioex){ 
     ioex.printStackTrace(); 
    } 
} 

回答

5

正在發生的事情是這樣的 -

fr.read()將返回一個整數,而不是一個角色,雖然返回的整數是該字符等效的ASCII碼。

當您調用該整數的String.valueOf()時,將調用String.valueOf(int i)方法,而不是您希望調用的String.valueOf(char c)方法,因此它以字符串形式返回ASCII值,而不是以字符串形式顯示字符值。

因此,不是,嘗試

lectura = String.valueOf((char) (fr.read())); 
+0

幾乎 - 整數不是ASCII值,FileReader使用平臺的默認編碼。 – 2012-02-27 01:02:08

+0

好的,有什麼區別? – CodeBlue 2012-02-27 01:03:15

+1

那麼,如果文件是用普通的7位ASCII字符編寫的,那麼就沒有區別。但是,如果文本編輯器使用latin1編寫它,fr.read()將返回一些不是有效ASCII碼的int。 (或者它可能會返回廢話,如果'Charset.defaultCharset()'是類似於UTF-8) – 2012-02-27 01:13:21

1

的FileReader的read返回int。你只需要將其轉換爲char

Reader原因的read不只是返回char是使用int讓它使用-1代表檔案結尾。

2

這是預期的行爲,文本存儲爲字節,每個字節都具有該字符的ASCII值。您可以將這些字節收集到一個字節數組中,然後使用新的String(數組);將它們轉換成字符串。或者你可以強制轉換爲char來轉換單個字符。

+1

的InputStream讀取字節,一個閱讀器讀取字符。 (令人困惑的是它們都被編碼爲整數)。這就是爲什麼InputStreamReader需要一個字符集;只將字節視爲字符是不正確的,儘管它可以用於ASCII。你不想從Reader中建立一個字節數組並調用'new String(byte [])';你會建立一個字符數組並調用'new String(char [])'。 – 2012-02-27 02:52:07

相關問題