2017-04-25 58 views
2

我已經寫了代碼接受一個字符和字符串:System.in()如何工作?

public static void main(String[] args) throws IOException { 
    System.out.println("enter one char"); 
    char c = (char) System.in.read(); 
    System.out.println("The char entered is :" + c); 
    String userInput; 
    System.out.println("Enter a string"); 
    Scanner s = new Scanner(System.in); 
    userInput = s.next(); 
    System.out.println("the string inputted is:" + userInput);} 

輸出:

enter one char 
asdfg 
The char entered is :a 
Enter a string 
the string inputted is:sdfg 

任何人都可以解釋爲什麼會這樣呢?

+2

'sdfg'是掃描器可用的下一個標記,所以它在最後調用's.next()'時消耗它。 –

+1

@TimBiegeleisen:謝謝你對我的問題的完美回答..感謝很多.. :) – Rupali

回答

3

Tim Biegeleisen所述,System.in()返回一個InputStream。掃描儀也可以在InputStream上運行。 InputStream的read()方法消耗流中的第一個字節,您將其轉換爲char(因爲它需要一個字節來存儲char,因此您可以在不截斷的類型之間進行轉換)。

讓我們來分解它。

System.in() https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#in

「標準」 輸入流。該流已經打開並準備好提供輸入數據。通常,此流對應於由主機環境或用戶指定的鍵盤輸入或其他輸入源。

的InputStream的read() https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html#read--

中讀取數據的從輸入流的下一個字節。值字節被作爲int返回取值範圍爲0至255 ...

掃描器 https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

掃描器斷開其輸入到使用定界符模式,默認情況下與空白匹配。然後可以使用各種下一個方法將產生的令牌轉換爲不同類型的值。

掃描儀的next() https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#next--

查找並返回來自此掃描器的下一個完整標記。一個完整的令牌之前和之後輸入的是,分隔符模式匹配...

System.in().read()將讀/消耗掉一個靜態的InputStream的第一個字節。從同一InputStream實例化new Scanner,然後調用next()消耗剩餘的令牌。

我鼓勵您瀏覽任何您無法理解的類或方法的Java API文檔。將事情分解成單獨的類型並檢查它們的構造函數和方法描述。

0

系統是java.lang包中的最後一個類。

read()方法 - >從輸入流中讀取一定數量的字節並將它們存儲到緩衝區數組b中。實際讀取的字節數作爲整數返回。此方法阻塞,直到輸入數據可用,檢測到文件結尾或引發異常。

System.in是一個InputStream,它通常連接到控制檯程序的鍵盤輸入。由於數據通常通過命令行參數或配置文件傳遞給命令行Java應用程序,因此System.in並不經常使用。

+0

System.in - InputStream。 –

+0

System.in.read() - 只讀取一個字節。 –

2

System.in: InputStream,通常連接到控制檯程序的鍵盤輸入。這只不過是一個鏈接到System類的OS流。使用System類,我們可以將從鍵盤到CPU的輸入流轉移到我們的程序中。這是在Java中如何實現鍵盤讀取。