• 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。

  • 相关阅读:
    C/C++打印堆栈信息
    adb shell input keyevent值所对应的字符
    Nautilus-Share-Message: Called "net usershare info" but it failed: Failed to
    ubuntu 安装lua错误
    ubuntu 16.04 安装jdk9错误
    国家统计信息查询网址
    Spring ApplicationListener配合-D实现参数初始化
    Feign Form表单POST提交
    window下绝对路径
    SpringBoot中使用配置文件
  • 原文地址:https://www.cnblogs.com/MYoda/p/11158716.html
Copyright © 2020-2023  润新知