2016-11-27 88 views
1

有人可以幫助理解下面的程序。從InputStream中捕獲的值在java中顯示不正確

import java.io.BufferedInputStream; 
import java.io.IOException; 

public class CmdReader { 
    public static void main(String []args) { 

     try (BufferedInputStream bis = new BufferedInputStream(System.in)) { 
      System.out.print("Enter age: "); 
      int age = bis.read(); 

      System.out.println("Hello, you are " + age); 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

輸出:

Enter age: 12 
Hello, you are 49 

不明白爲什麼49代替印刷的12

我將非常感謝您的幫助。

回答

6

49是數字1的ASCII碼。您的代碼僅在中讀取,只有第一個字符,並將它分配給int使用字符的值—它不會將其轉換爲它所表示的數字。你應該看看使用Scanner或其他解析值的方法; BufferedInputStream只讀取數據,沒有別的。

+0

實際上,49是System.in讀取的第一個字節的值。它是否是ASCII(最有可能不是)取決於[編碼](http://www.iana.org/assignments/character-sets/character-sets.xhtml#table-character-sets-1)的終端或任何正在饋送System.in。但是,建議使用文本庫來閱讀文本是正確的。 –

+0

謝謝你的投入,我想知道有沒有什麼辦法,以字節蒸汽值轉換爲char流(編碼級別像StreamEncoder),因爲是BufferedInputStream爲基於字節流和System.out的是基於字符流。因此,它通過編碼表示數據的不同之處在於,字符流使用Unicode表示法。我通過Charset API查看在Java中更改編碼,無法接聽。糾正我,如果我錯了。請建議Java內置的API。 –

+0

對於上面的輸出,我所期待的是當我通過字節流進入1下,System.out應該打印1雖然是一款基於編碼或類似的東西字符流。 –