問題前景
學java的都知道輸出語句是
System.out.println("你好");
但是獲取輸入的值爲什麼這麼麻煩呢
我們通常使用的方式如下
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
如果你在給萌新講課,那麼你不僅要解釋
public static void main(String[] args)
這句廢話
還要解釋
Scanner scan = new Scanner(System.in);
着實有點心累。
而且就算入門了,也只是吧經歷放到了其他核心api或者一些其他的技術,根本沒有想過去了解下java的輸入原理(反正我是這樣)
然後我在教同學java的時候,我甚至直接從jshell開始,因爲不想解釋上面兩句廢話
先把基礎語法學會,然後開始解釋public是什麼 static 是什麼
言歸正傳,這裏來看下系統的輸入輸出
控制檯輸出
要想知道爲什麼是System.out.println("你好");
就要先知道System.out
是個什麼東西
我們通過源碼追蹤找到
他這裏是一個PrintStream類型一個靜態變量,然後我們繼續追蹤,發現同樣也是Output類型的。
使用PrintWriter
我們都學過java的io操作,我們可以嘗試使用PrintWriter試一下
發現結果都一樣,唯一的不同就是我們使用完畢系統輸出後
需要爲了節省資源來關閉流
而我們使用System.out.println("你好");
的時候並不需要關閉流
最後總結出:
系統的System.out.println();
能幫我們更好的管理流,關閉流和釋放資源都是系統來幫我們完成的
控制檯輸入
那麼問題就來了,那爲什麼系統不把好事做到底,順便把System.in也這樣做
我們可以嘗試一下,看看能直接讀取到什麼
使用字節流讀取字節
下面我們寫一個最原始的獲取控制檯輸入的案例
使用BufferReader
然後我們可以使用BufferReader來給他升升級
結果還是寫了一大老堆代碼
而且,他讀取的內容也十分有限制
瞭解Scanner
Scanner是什麼,他真的只是一個從控制檯輸入的嗎
他的構造方法有很多,但歸根結底一句話,就是處理流中的字符串
Scanner裏面有非常多的能幫助我們轉換數據
所以,推薦使用Scanner的目的就是使用方便,我們能夠按照我們的需求獲取流中的數據(不僅僅是控制檯)
我們可以使用Scanner來讀取一個txt文件
如果我們知道下一行是一個數字還是字符串還是其他類型,我們就可以使用Scanner來讀取
不過這個一般不會使用,這裏只是舉例說明
我們用的更多的是xml、json等比較成熟的文件,所以用不到Scanner
而最適合的當然就是我們用戶手動輸入的,所以,我們知道接下來系統要讀取的數據,我們就按照需求在控制檯輸入,從而達到目的。
總結
Scanner:用來處理流中的文字,來獲取我們想要的值
System.out:系統來幫我們管理、關閉和釋放資源