關於System.in和System.out

初次涉及IO是從鍵盤中輸入,在控制面板上輸出。

最簡單的輸入語法是:

Scanner input = new Scanner(System.in);

int x = input.nextInt();

最簡單的輸出語法是:

System.out.println();

在剛接觸Java的時候根本不知道System.in是什麼東西,也不明白爲什麼System.out.println()爲什麼會在控制面板上輸出。

學完二進制輸入輸出後,一切開始明朗。

先說說System.in是什麼。

查看API文檔,在java.lang包中的方法System類中發現in是System中的由final修飾的InputStream類型的常量

in

public static final InputStream
“標準”輸入流。此流已打開並準備提供輸入數據。通常,此流對應於鍵盤輸入或者由主機環境或用戶指定的另一個輸入源。

 

這說明System.in指的是一個輸入流(InputStream),它的功能是創建一個由鍵盤輸入的流

再說說System.in的工作原理。

衆所周知,一個流必須要有一塊地方提供該流的源頭或者結尾,比如FileInputStream的構造方法:FileInputStream in = new FileInputStream(filesName)//filesName指的就是供該流讀取字節的文件。大部分流都會有這樣的一個文件。那System.in這個輸入流的源頭在哪裏呢?System.in比較特殊,在使用這個流的時候,源頭會更新,也就是說它的源頭是新開闢出來的空間,用來儲存鍵盤上輸入的內容。

當我們調用System.in語句的時候實際上我們做了兩個動作:1.創建了一個字節流;2.創建了一個類似於文件的儲存空間(用完即被消除)。試分析下面語句:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

while((s=in.readLine)!=null){

        //循環主體

}

這種從鍵盤上向一個流中輸入數據的方法稱爲阻塞式方法,當你不在鍵盤上輸入數據或者沒有按enter鍵輸入的時候,循環是不會進行的,流會暫停流動。

最後說說System.out.println().

這裏的System.out不用我說大家也應該猜到,它也是一個流,翻看API文檔:

out

public static final PrintStream
“標準”輸出流。此流已打開並準備接受輸出數據。通常,此流對應於顯示器輸出或者由主機環境或用戶指定的另一個輸出目標。

不過他是一個PrintStream類型的流,PrintStream類定義了println()方法,它的作用是想輸出流的“尾巴”輸出數據,而System.out的“尾巴”是可以設置的,設置語句爲:System.setOut();//括號內是"尾巴",可以是一個文件,也可以是一個臨時定義的容器類對象。

這兩個東西其實不必深究,但是我總覺得有時間的話這些細節還是搞搞明白比較好,內心覺得踏實,我也是新手,希望各位大神不吝賜教,如果寫得東西有誤,希望各位大神不吝賜教。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章