[JAVA]對Scanner類從控制檯接受多行信息引發的疑問

經常看到輸入矩陣啥的,但是在實際操作中輸入一行就沒了。爲了弄清這個疑惑,挖這個Scanner類;


1.System.in 這個對象是屬於InputStream類的。是很簡陋的一個輸入流對象。
擁有read()方法,他按順序單次讀取你的輸入,返回一個ASC2數字(包括換行符)。一般在做題和生產中不調用read()方法。


2.BufferedReader 這個類適合讀取大批次的輸入數據,沒有自定義分隔符功能。

使用時候一般是先

BufferedReader br=new BufferedReadernew inputStreamReader(System.in));`

它僅有2個方法

	read()--返回單個ASC2,沒有爲-1;readline()---返回下一行 

3.Scanner 這個類適合比較精巧的題目輸入,使用簡單功能靈活,提供自定義delimiter分隔符。
一般用的時候只需要

Scanner sc=new Scanner(System.in);
sc.useDelimiter(",");//就可以自定義分隔符,掃描的時候就會自動忽略“,”

Scanner的方法很多很靈活:

sc.next();//空格分界來讀取字符串
sc.nextInt();//空格分界來讀取int,如果不是空格分界,試着用一下sc.useDelimiter(“支持正則表達式和字符”)【主義==注意,一但使用“,”在最後也必須加一個,告訴scanner結束】
sc.nextline();//依靠換行符來讀取字符串,所以性質決定了它一次只能讀一行做題的時候需要多次nextline(),進行逐行輸入纔可以實現處理多行,但是在讀大文件的時候就很方便。
sc.hasXXX()//用來判斷是否還有下一個數字,下一個行等等;

注string.split(","):可以把字符串拆分爲數組;

    public static void main(String args[]) {
        String str = "小學,初中,高中,大專,本科,研究生,博士";
        String[] buff = str.split(",");
        for(int i=0;i<buff.length;i++){
            System.out.println(buff[i]);
        }
    } } ```

最後至於多行的實現:
其實多行輸入不是一次輸入多行,而是逐行輸入然後一直到輸入空爲止才結束。
System.in的輸入是阻塞式的,只有你叫scan.next()之類行爲跟他要輸入的時候纔會去從控制檯要你輸入,所以,從根本上逐行輸入一直到空是最優解。
實例代碼如下:

public class Solution {

    public static void main(String[] args){
        Scanner scan =new Scanner(System.in);//System.in的輸入是阻塞方式輸入,你要他纔會請求,不要就不請求
        StringBuffer str=new StringBuffer();//stringbuffer要比string靈活且功能強大得多。
        String mid="";
        while(!((mid=scan.nextLine()).equals(""))){//System.in的輸入是阻塞方式輸入,你要他纔會請求,不要就不請求
            str.append(mid+"\n");
        }
        System.out.println(str);

    }
}

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