2013-11-27 65 views
0

我注意到下面這行代碼存在很多。 (例如在這個網站。)程序員是否有任何理由使用System.in.read()中的char?

​​

我們測試特定字符鍵擊,或ASCII值,或者轉義序列,等等。

if (ch == 'a' || ch == 65 || ch == '\n' || ch == 13) System.out.print("true"); 

是否使用一個char上述提供下面的代碼行使用int的任何好處?

int i = System.in.read(); // uses an int, which requires no cast. 

int變量「i」可以用在上面相同的if語句中。

+1

老實說,答案可能和可讀性一樣簡單。其目的是將它用作字符,所以程序員將它轉換爲字符。 – riwalk

回答

2

兩種方法都不正確。從System.in讀取字符的正確方法是使用InputStreamReader(如果提供了正確的功能,則使用Scanner)。原因是InputStream.read()讀取單個字節,而不是字符,有些字符需要讀取多個字節。將字節轉換爲字符時,您還可以指定要使用的字符編碼。

Reader rdr = new InputStreamReader(System.in); 
int i = rdr.next(); 
if (i == -1) { 
    // end of input 
} else { 
    // normal processing; safe to cast i to char if convenient 
} 
+0

關於示例代碼中的第一行:'Reader rdr = new InputStreamReader(System.in);' 請解釋爲什麼變量「rdr」是Reader類型的,而不是InputStreamReader類型的?具體來說,請你解釋一下這個提供的好處。非常感謝。 另外,在你的代碼示例中,當你使用方法next()時,你的意思是read()嗎? – user2911290

+1

@ user2911290 - 在這種情況下沒有特別的好處。這只是習慣;我通常編程到一個接口,除非我需要更具體類型的特定功能。它使代碼的未來演變更容易。 (例如,我可以切換到一個'CharArrayReader'或一個'PipedReader',而不用擔心是否依賴於方法或特定於行爲的'InputStreamReader'。) –

2

根本沒有理由演員。這是精細

int i = System.in.read(); 
if(i == 'a'){ 
    // do something 
} 

你可以做到這一點,因爲'a'是一個int範圍內的值。

此外,要知道,閱讀文件,這樣當直接做投爲char 可以是有問題的,因爲什麼呢InputStream.read()讀一個byte不是char。 A char是兩個字節寬。

相關問題