java IO(一):BufferedReader和Scanner

这篇记载BufferedRead类和Scanner类如何实现java Input,以及他们的注意事项和区别。

首先说说BufferedRead:

BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。

public class Test{
    public static void main(String[] args) throws IOException{
        char c;
        String s;
        //创建一个BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        do{
            c = (char)br.read();//读取一个字符
            System.out.print(c+" ");
        }while(c != 'q');
        do {
            s=br.readLine();//读取一个字符串
            System.out.println(s);
        }while(!s.equals("quit"));
    }
}

运行结果为:

gxnrun
g x n r u n
q
q
gxnrun
gxnrun
quit
quit

Process finished with exit code 0

接下来说Scanner:

创建Scanner对象后,在读取前我们一般需要 使用 hasNext 与 hasNextLine 判断是否还有输入的数据

但是在这里使用hasNext会产生一个问题:假如代码如下

public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据
 
        // next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        if (scan.hasNext()) {
            String str1 = scan.next();
            System.out.println("输入的数据为:" + str1);
        }
        scan.close();
    }
}

那么当我输入abcd efg时,efg并不会被读入,但如果将if改为while,那么输入完abcd efg,虽然abcd和efg被分成两次读入了,但是执行完后光标仍停留在下面等待下一个输入(即该while无法结束)。这个原因是当执行到hasNext()时,它会先扫描缓冲区中是否有字符,有则返回true,继续扫描。直到扫描为空,这时并不返回false,而是将方法阻塞,等待你输入内容然后继续扫描。所以该while循环的参数不会为false,成为死循环。

解决方法:

使用带有参数的重载方法,当扫描到的字符与参数值匹配时返回true,代码如下

public class Test{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据

        // next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        while(!scan.hasNext("#")) {
            String str1 = scan.next();
            System.out.println("输入的数据为:" + str1);
        }
        scan.close();
    }
}

这样当我们输入"#"时,scan.hasNext("#")便会返回true,取反后变为false,循环就会结束。

接下来看看nextLine:

public class Test{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据

        // nextLine方式接收字符串
        System.out.println("nextLine方式接收:");
        // 判断是否还有输入
        while (scan.hasNextLine()) {
            String str2 = scan.nextLine();
            System.out.println("输入的数据为:" + str2);
        }
        scan.close();
    }
}

这样输入gxn run 时,整一行会被一并读入,带空格,然而使用while时,hasNextLine仍会阻塞,且这次不能带参数,只能在循环内设置条件break出去

next()和nextLine的区别:

最后scanner中还有hasNextInt(),nextInt()和hasNextFloat(),nextFloat()等可以进行整数小数输入校验和读取的功能,在这类方法中,输入了不符合规定的数据(比如hasNextInt我输入了1.2或12en),便会返回false。

原文地址:https://www.cnblogs.com/MYoda/p/11158716.html