天天看点

JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner

5.1 用户交互Scanner

  • 用户交互Scanner
  • 顺序结构
  • 选择结构
  • 循环结构
  • break & continue
  • 练习
Scanner 的学习,是让我们 和 计算机 有基本的交互,比如说 “输入” 和 “输出”,程序获取我们用户输入的东西,并且反馈输出给我们一些有用的信息。在C/C++中我们一般采用 scanf&printf 、 cin&cout。

Java5 引入 Scanner 类,为了 支持 最基本的 人机交互。

  • 语法格式:
  • 通过Scanner 类的 next() 与 nextLine() 方法 是用来获取 输入的字符串的,在读取前 我们一般需要使用 hasNext() 与 hasNextLine() 判断是否还有输入的数据。

5.1.1 hasNext && next

import java.util.Scanner;

public class 输入和输出 {
    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收 键盘数据
        Scanner scanner = new Scanner(System.in);

        System.out.println("使用next方式接收:");

        //判断用户有没有 输入字符串
        if(scanner.hasNext()){
            //使用 nex 方式接收
            String str = scanner.next();
            System.out.println("输出的内容为:"+str);
        }
        //凡是属于 IO流 的类 如果不关闭,会一直占用资源,要养成好习惯,用完就关!
        scanner.close();//直接释放掉 就行。
    }
}
           

next() 遇到 空格 将会终止,不再读取字符串!

但是如果你不输入 有效地字符串,那么会一直让你输入下去,输入了有效字符串之后,再输入空格和回车才会被终止!

JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner

5.1.2 hasNextLine && nextLine

nextLine() 直接获取一行,不会遇到空格终止,会读取空格!

package Scanner;

import java.util.Scanner;

public class hasNextLineAndnextLine {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("hasNextLine接收:");
        if(scanner.hasNextLine()){
            String str = scanner.nextLine();
            System.out.println(str);
        }
        scanner.close();
    }
}
           
JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner

5.1.3 Scanner进阶用法

实际上 Scanner 扫描器 功能还是很强大的,它可以直接 判断和接收 准确类型的数据。

比如:nextInt() 只获取 整数

nextFloat() 只获取小数

package Scanner;

import java.util.Scanner;

public class 进阶方法 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i = 0;
        float f = 0;
        System.out.println("请输入整数:");
        //来判断输入的是否是 整数
        if(scanner.hasNextInt())
        {
            i = scanner.nextInt();
            //如果是整数,那就获取 这个整数数据
            System.out.println("整数数据为:"+i);

        }else
        {
            String str = scanner.next();
            //如果不是整数,那也要把这个数据继续获取下来,否则下一个的 小数获取 还会从当前 IO流位置 进行!!!
            System.out.println("你输入的不是整数数据!");
        }

        System.out.println("请输入小数:");
        if(scanner.hasNextFloat())
        {
            f  = scanner.nextFloat();
            System.out.println("小数数据为:" + f);
        }else
        {
            System.out.println("你输入的不是小数数据!");
        }
    }
}
           
JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner

注意事项:IO流是从开头往下顺着来的,如果你不让光标位置移动,那么光标会一直停在那个位置,而对于我们新手而言,目前能让光标移动的方法就是获取/读取 输入的数据,获取一行,光标就会移动到下一行!!!

如果不让光标移动,会出现什么情况?

//String str = scanner.next();

//如果不是整数,那也要把这个数据继续获取下来,否则下一个的 小数获取 还会从当前 IO流位置 进行!!!

System.out.println(“你输入的不是整数数据!”);

我们在这里,不去进行读取数据,那么如果第一个数据不是整数,光标就会一直在开头的位置,那么小数的读取就还会读取第一个数据!!!

JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner
JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner
就会导致 这样的 情况 发生,所以 以后 出现这种情况,很明显 是因为 IO流的 光标位置 并没有 像我们 想的那样 进行移动或退回!!!

5.1.4 练习:sum && average

package Scanner;

import java.util.Scanner;

public class 练习 {
    public static void main(String[] args) {
        double sum = 0;
        int m = 0;
        int num1 = 0;
        double num2 = 0;

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入几个数:");
        while (true)//循环一直进行着,死循环,这样才能一直接收数据
        {
            if(scanner.hasNextInt())//可能是整数
            {
                num1 = scanner.nextInt();
                m++;
                sum+=num1;
            }
            else if(scanner.hasNextDouble()) {//也可能是小数
                num2 = scanner.nextDouble();
                m++;
                sum += num2;
            }
            else if(scanner.hasNext())//如果既不是整数,也不是小数,那就要判断是否是 字符串 break,如果是 则退出!
            {
                  String str = scanner.next();
                if(str.equals("break"))
                {
                    System.out.println("已结束录入数据!");
                    break;
                }
            }
            else
            {
                System.out.println("出现异常情况!请开发者处理!");
            }
        System.out.println("总数:"+sum);
        System.out.println("平均数:"+sum/m);
        scanner.close();//别忘了 释放掉哟 ~ ~   
    }
}

           
JavaSE 26 流程控制 → Scanner5.1 用户交互Scanner