1,javase程式碼實戰——基礎語法(一)

程式設計侯發表於2018-02-24

1,輸出錯誤資訊及除錯資訊

問題介紹:
在程式開發中,我們要為了要知道程式執行中的一些情況,就需要在程式程式碼中插入一些輸出語句,甚至程式出現嚴重的錯誤時,也要給出警告提示。

程式碼實現:

public static void main(String[] args) {
        System.out.println("我是一個輸出的資訊");
        System.err.println("我是一個警告的資訊");
    }

效果這裡寫圖片描述

總結:out和err是system類中的final static的類變數,它們兩個都是PrintStream類的例項物件。所以,在不建立system類物件的情況下,就可以使用。但是,out最好用於輸出除錯資訊,在ec’li’pse的控制檯中字型顏色是黑色的。err最好用於輸出錯誤資訊,在ec’li’pse的控制檯中字型顏色是紅色的。

擴充套件:
淺析system類:
1,System類是final static 定義的,所以他不能被繼承,也不用進行例項化。
2,作用:System是一個工具類,有標準輸入、標準輸出和錯誤輸出流;獲得系統屬性,返回毫秒數,拷貝陣列,獲得系統屬性,執行垃圾回收器,退出虛擬機器等等。
3,我們只看標準輸出和標準錯誤輸出流。即:
public final static PrintStream out = nullPrintStream();
public final static PrintStream err = nullPrintStream();
提出一個面試題:
out或 err 是一個變數還是一個內部類呢?
答:out或err是一個PrintStream的類變數,不是一個內部類。

淺析printStream類:
這裡寫圖片描述
1,OutputStream是一個抽象類,FilterOutputStream是它的子類。PrintStream又是它的子類。
OutputStream此抽象類是表示輸出位元組流的所有類的超類。輸出流接受輸出位元組並將這些位元組傳送到某個接收器(控制檯,磁碟等)。 需要定義 OutputStream 子類的應用程式必須始終提供至少一種可寫入一個輸出位元組的方法。
FilterOutputStream 類本身只是簡單地重寫那些將所有請求傳遞給所包含輸出流的 OutputStream 的所有方法。FilterOutputStream 的子類可進一步地重寫這些方法中的一些方法,並且還可以提供一些額外的方法和欄位。
注:FilterOutputStream只能輸出byte型別。
2,作用:可以輸出任意型別的資料型別,不在僅限與byte型別;可輸出格式化的資料;可以追加字元到輸出流。還有覆蓋父類的一些write等方法並實現了輸出。
3,隨便看一個輸出型別的原始碼:

public void print(int i) {
    write(String.valueOf(i));
    }

private void write(String s) {
    try {
        synchronized (this) {
        ensureOpen();
        textOut.write(s);
        textOut.flushBuffer();
        charOut.flushBuffer();
        if (autoFlush && (s.indexOf('\n') >= 0))
            out.flush();
        }
    }
    catch (InterruptedIOException x) {
        Thread.currentThread().interrupt();
    }
    catch (IOException x) {
        trouble = true;
    }
    }

可以發現,PrintStream的兩個write的方法中只有char和string型別,所以其他型別先借助String類轉為String型別在做輸出操作。

2,從控制檯接受輸入

問題介紹:
使用者需要輸入密碼,怎麼從控制檯接受輸入的密碼?
程式碼實現:

public static void main(String[] args) {
        System.out.println("請輸入密碼");
        Scanner s =new Scanner(System.in);
        String psd =s.nextLine();//接受一行文字輸入
        if(psd.equals("123456"))
            System.out.println("密碼正確");
        else 
            System.err.println("密碼錯誤");
    }

總結:in也是system中的一個輸入流類變數,Scanner是掃描工具類。Scanner中封裝了輸入流物件,所以可以從控制檯讀取資料。

擴充套件:

1,public final static InputStream in = nullInputStream();
in和err,out都是system中的類變數。
2, inputStream輸入流是以位元組為單位讀取資料的,要經過複雜的判斷和建立緩衝陣列,而且還會出現亂碼的情況。所以對於字元資料的獲取,應該使用Scanner掃描類對輸入流,檔案等進行封裝,在獲取字串型別的資料,是一個很好的方法。
3,淺析Scanner類
(1)是一個簡單的文字掃描器,使用正規表示式來解析基本型別和字串。
(2)檢視構造方法,可以從檔案,輸入流,通道,字串等進行掃描。
(3)檢視方法,可以掃描int,double等各種型別的資料,可以自己設定正規表示式掃描資料,返回掃描器的語言環境等等

重定向輸出流實現程式日誌

問題介紹:假如我想向一個檔案中輸出程式中的日誌資訊怎麼辦?
問題分析:system是一個工具類,有標準的輸入輸出的功能。它封裝了輸出流物件,即out變數是java的標準輸出流,但是用final所定義,所以無法進行修改。繼續檢視system的api可以發現java提供了public static void setOut(PrintStream out)等方法
這裡寫圖片描述
可見,只要建立好相應的輸入輸出流物件,就可可以實現向制定的位置輸出日誌資訊。
程式碼實現:

/**
 * 1,先保留原有的輸出流,如果還要在用到的話。
 * 2,建立新的指定的流物件,呼叫system的setXXX()方法傳入。
 * 3,使用system的輸出方法即可,即實現了向指定的位置輸出資訊。
 * 
 */
        PrintStream pout =System.out;
        PrintStream p =null;
        try {
            p =new PrintStream("G:\\txt.txt");
            System.setOut(p);
            System.out.println("程式正常執行");

            System.setOut(pout);
            System.out.print("輸出日誌成功");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }

總結:我們在使用System類的標準輸入、標準輸出和錯誤輸出流的功能時,預設的是向控制檯輸出資訊,如果我們要向制定的位置輸出,只需要自己建立指定的輸入輸出流,呼叫setOut()方法,這樣我們在使用System中的輸出方法,就輸出到我們指定的位置了。

擴充套件:
1,實現輸出資訊的方式有很多中,這裡我們使用了System類,我們也可以只使用java中的輸出流。也可以直接使用PrintStream類。

PrintStream p =null;
        try {
            p =new PrintStream("G:\\txt.txt");
            p.println("我是程式的日誌檔案");
            p.println("程式執行正常");

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            p.print("程式執行異常");
            e.printStackTrace();
        }

他們最後都是呼叫的原始碼:

 public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
    }

自動型別轉換與強制型別轉換

問題介紹:
java基本資料型別之間存在著兩種自動型別轉換:自動型別轉換和強制型別轉換。

byte b =127;
        short s =23561;
        int i =12345;
        long l =12334455L;

        char c ='w';

        float f =1.1f;
        double d =123.123;

        //自動轉換
        System.out.println("byte+int 首先byte轉int在做加法 結果"+(b+i));
        //強制型別轉換
        System.out.println("double轉int 結果 "+(int)d);

相關文章