Java的輸出及輸入控制大都定義在java.io.*裡,像是檔案File的讀寫,週邊設備RS232、LPT等的輸出與輸入都需要到Java IO。而Java IO大概分成二大類,一類是byte的讀取與寫出,可讀取寫入二位元binary的資料,而另一個是char的讀取與寫入,提供文字的讀取與寫入。
System類別並不屬於java.io的套件,而是屬於java.lang套件,在使用時預設載入,所以並不需要特別去import它。
- System.in 通常是指鍵盤的輸入,為java.io.InputStream類別
- System.out 通常是指Console螢幕輸出,為java.io.PrintStream類別
- System.err 同System.out,主要是用在系統出錯時輸出至Console螢幕
註:Java本身在處理字串時均是使用utf8 uncode的方式,不過在Windows的Console(螢幕)字串的顯示與輸入都是使用ISO-8859-1編碼,所以需要先把字串轉換成Big5再行輸出,在Linux上則不會有這種問題。
System.out
- System.out.println(內容):輸出”內容”加上”斷行\r\n”至Console(螢幕)
- System.out.print(內容):輸出”內容”至Console(螢幕)
如果要輸出的內容需要有字串、文字、日期等,可以利用字串的連接+來把字串串連起來進行輸出。ex.”中文”+123
如果需要自行做斷行,可以使用\r\n來做換行動作。ex.System.out.print(“中文\r\n我換行了”);
範例原始碼:
package yku.tech; public class SysOut { public static void main(String args[]) { //會自動加入斷行\r\n System.out.println("Hello World!!"); //不會斷行 System.out.print("This is a test!"); System.out.print(" 這會接在字串後面 "); //數字、浮點、長整數、字元、字串都可以輸出 System.out.println(546); int a = 456; System.out.print("數字:"); System.out.println(a); float b = 234.12f; System.out.print("浮點數:"); System.out.println(b); double c = 987.1; System.out.print("Double:"); System.out.println(c); char d = 'a'; System.out.print("字元:"); System.out.println(d); String e = "中文字"; System.out.print("字串:"); System.out.println(e); Object f = new Object(); System.out.print("物件:"); System.out.println(f); System.out.print("物件toString:"); System.out.println(f.toString()); } }
System.in
System.in為InputStream串流類別,可以直接使用read(byte[])來取出輸入內容、read()每次輸入的ascii數字(再轉換成字元char),或是利用BufferedReader來直接讀取一行內容等等,以下範例會實作這幾種種方式。
鍵盤的輸入完成預設為enter鍵,也就是\r\n。
(char)read()
對於中文字部份並無法判別,需要先把讀入的字元全部放進一個char 陣例,再利用new String(char[])來使中文字正常
範例原始碼:
package yku.tech; public class SysIn { public static void main(String args[]) { // 輸入串流 java.io.InputStream in = System.in; char c; try { System.out.print("請輸入字串:"); while ((c = (char) in.read()) > 0) { System.out.print(c); if (c == '\n')// 換行符號 System.out.print("請輸入字串:"); } } catch (java.io.IOException ex) { ex.printStackTrace(); } } }
使用BufferedReader一次讀取一行
需先把System.in轉換成InputStreamReader才可以讓BufferedReader使用,中文部份在此例子並不需要特別處理
範例原始碼:
package yku.tech; public class SysIn2 { public static void main(String args[]) { // 輸入串流 ,變成BufferReader java.io.BufferedReader buf = new java.io.BufferedReader( new java.io.InputStreamReader(System.in)); String c; try { System.out.print("請輸入字串:"); while ( (c=buf.readLine())!=null) { System.out.println(c); System.out.print("請輸入字串:"); } } catch (java.io.IOException ex) { ex.printStackTrace(); } } }
read(byte[])
當輸入的內容長度大於byte長度時,就會被先行輸出,而byte陣例設定越大使用的記憶體也越大。中文部份因為Console是ISO-8859-1編碼,所以需要利用new String(byte[],”編碼”)來轉換成Big5輸出
由底下第一個圖可以知道當byte[]設定128時,字串輸入不足128長度時,輸出時還是會自動補足的,所以String內容還需要使用trim來去除多出來的空白部份。
範例原始碼:
package yku.tech; public class SysIn3 { public static void main(String args[]) { // 輸入串流 java.io.InputStream in = System.in; // 會一次讀取128個byte,如果輸入不夠時一樣會以空白填滿 byte[] b = new byte[128]; try { System.out.print("請輸入字串:"); while (in.read(b) > 0) { // 加上trim把不需要的空白移除 String str = new String(b, "Big5").trim(); System.out.println(str); System.out.print("請輸入字串:"); } } catch (java.io.IOException ex) { ex.printStackTrace(); } } }
不好意思請問一下,要怎麼讓這個程式停下來 🙂
Console程式return掉就好了
GUI程式System.exit();