[Java]基本IO輸出Output及輸入Input-Console

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我換行了”);

Out.png

範例原始碼:

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[])來使中文字正常

In.png

範例原始碼:

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使用,中文部份在此例子並不需要特別處理

In2.png

範例原始碼:

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來去除多出來的空白部份。

In3.png

In3-1.png

範例原始碼:

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();
        }
    }
}

2 thoughts to “[Java]基本IO輸出Output及輸入Input-Console”

發表迴響