簡體   English   中英

System.in和Scanner對象

[英]System.in and Scanner object

我在了解System.In的特定工作時遇到了一個問題,我所了解的是這是System類中的一個數據字段,並且它的聲明是

public static final InputStream in

它被聲明為final,因此無法更改,正如Oracle資料中提到的那樣,他們說“ in”是“標准”輸入流。 該流已經打開,可以提供輸入數據了。 通常,此流對應於鍵盤輸入或主機環境或用戶指定的另一個輸入源。

這到底是什么意思?

當我編寫以下代碼時:

Scanner input = new Scanner(System.in);

該Scanner對象已准備好掃描System.in中的內容,但是CMD上沒有任何顯示

另一點是,當我嘗試打印System.in時,最終輸出如下

java.io.BufferedInputStream@15db9742

誰能解釋一下整個過程以及System.in和Scanner類的確切工作!

System.inBufferedInputStream ,這樣的Stream可以是任何輸入流(例如,網絡套接字或文件),也可以是標准輸入通道stdin

stdin是您在命令行中鍵入的內容,因此很明顯,它不顯示任何內容。

當您按照問題所示創建Scanner ,您會將標准輸入通道送入該Scanner ,但是直到被要求Scanner ,掃描儀才做任何事情。 掃描器是包裝器 :一種構造(使解析stdin輸入更加容易(更方便))。 從某種意義上說,它沒有提供其他功能,您可以自己完成掃描程序的全部工作,但是如果您要從stdin 解析整數,使用掃描程序會更容易。

因此,當您輸入實例時:

Scanner sc = new Scanner(System.in);
int val = sc.nextInt();
System.out.println(2*val);

它將等到您輸入一行,將其解析為整數,然后在標准輸出通道( stdout )上打印輸入值的兩倍。


一些結論性注釋:

System.in不是final ,可以使用System.setIn將另一個輸入流設置為標准輸入字符串。 例如文件或網絡套接字。 如果您將程序調用為java -jar program.jar < inputfile ,則默認的System.in也可以從文件或管道中獲取輸入。

Scannerjava.util包中的類。

當您編寫Scanner sc=new Scanner(System.in)您試圖從"standard" input stream讀取"standard" input stream 主要是System.in用於從控制台讀取輸入

掃描程序會保持程序執行,直到輸入到達為止,這就是本來的意思。

您的問題是,在打印System.in時最終會得到類似java.io.BufferedInputStream@15db9742的輸出,該輸出稱為對象hash code ,如果嘗試執行以下操作,則很可能會得到這種輸出打印對象。 在這里,您將獲得哈希碼,因為您正在嘗試打印整個流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM