[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);

    }
}

你可能感兴趣的:(java)