Scanner

Java 用 Scanner 类接受键盘输入. Scanner 在 java.util 包中定义. 当使用的类不是定义在 java.lang 包中时, 需要使用 import 指令导入相应的包.

因为输入对所有人都是可见的, 所以 Scanner 类不适合从控制台读取密码.

步骤:

  1. 导入该类所在的包 (要使用一个类的话就必须先导入该类所在的包)

  2. 创建该类的对象

  3. 调用里面的功能

Scanner 有两套系统.

第一套系统:

nextInt();
nextDouble();
next();
// 等等...

第二套系统:

nextLine();  // 接收一行输入

程序示例:

import java.util.Scanner;  // 导包

public class Input {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 只有 sc 是变量名, 只有 sc 可以改变, 其他的都不允许改变. 
        System.out.print("请输入一个用户的名字: ");
        String name = sc.next(); // 接收一个字符串
        System.out.print("请输入用户的年龄: ");
        int age = sc.nextInt(); // 接收一个整数
        System.out.print("请输入用户的薪水: ");
        double salary = sc.nextDouble(); // 接收一个 double 数据
        System.out.println("用户信息如下:");
        System.out.println("姓名: " + name);
        System.out.println("年龄: " + age);
        System.out.println("薪水: " + salary);
    }
}

执行结果:

请输入一个用户的名字: 小章
请输入用户的年龄: 20
请输入用户的薪水: 20000
用户信息如下:
姓名: 小章
年龄: 20
薪水: 20000.0

第一套系统, 遇到空白停止接收, 剩余输入存在于缓冲中, 等待下一次读入.

程序示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("enter some words: ");
        String s = sc.next();
        System.out.println(s);
    }
}

执行结果:

enter some words: xiao cheng
xiao

程序示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        System.out.println("Enter some words:");
        Scanner sc = new Scanner(System.in);
        String s1 = sc.next();
        System.out.print(s1);
        System.out.println("结束");
    }
}

执行结果:

Enter some words:
Hello World
Hello结束

这里结束二字跟随上一个输出一个输出在同一行, 这说明 next() 方法读取输入时, 将键盘录入的空格符丢弃了, 既不会保留在缓存中, 也没有保存到存储输入的变量中.

再次执行:

Enter some words:
    Hello world
Hello结束

此处在输入的前面有多余的空格, 但是 next() 读取输入时这些空格被舍弃了.

程序示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        System.out.println("Enter an integer:");
        Scanner sc = new Scanner(System.in);
        int s1 = sc.nextInt();
        System.out.print(s1);
        System.out.println("结束");
    }
}

执行结果:

Enter an integer:
100
100结束

这里结束二字跟上一个输出在同一行, 这说明 next() 方法没有将输入的 100 后面的换行符读取到变量 s1 中.

再次执行:

Enter an integer:
    100
100结束

此处在输入的前面有多余的空格, 但是 nextInt() 读取输入时这些空格被舍弃了.

程序示例:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个整数:");
        int num1 = sc.nextInt();
        System.out.println(num1);
        System.out.println("请输入第二个整数:");
        int num2 = sc.nextInt();
        System.out.println(num2);
    }
}

执行结果:

请输入第一个整数:
123 456
123
请输入第二个整数:
456

可以看出, 输出的 456 前面没有空格, 这是因为在 nextInt() 读取下一个数字时, 自动去掉了 456 前面的空格.

程序示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        System.out.println("Enter an integer:");
        Scanner sc = new Scanner(System.in);
        int s1 = sc.nextInt();
        System.out.print(s1);
        System.out.println("结束");
        System.out.println("Enter an integer:");
        int s2 = sc.nextInt();
        System.out.print(s2);
        System.out.println("结束");
    }
}

执行结果:

Enter an integer:

   12
12结束
Enter an integer:

     14
14结束

可以看出, nextInt() 读取数字时, 跳过了数字前面的所有空白, 包括换行符. 因此在遇到连续的两个输入时, 前一个输入会留下一个换行符在缓存中, 等待下一次的读取, 然而下一次的读取又跳过了这个换行符.

程序示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        System.out.println("Enter an string:");
        Scanner sc = new Scanner(System.in);
        String s1 = sc.next();
        System.out.print(s1);
        System.out.println("结束");
        System.out.println("Enter an string:");
        String s2 = sc.next();
        System.out.print(s2);
        System.out.println("结束");
    }
}

执行结果:

Enter an string:

hello
hello结束
Enter an string:

    world
world结束

可以看出, next() 和 nextInt() 有相同的效果.

程序示例:

import java.util.Scanner;

public class Input {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a, b;
        System.out.print("输入一个整数: ");
        a = sc.nextInt();
        System.out.print("输入另一个整数: ");
        b = sc.nextInt();
        System.out.println("两个整数的和为 " + (a + b));
    }
}

执行结果:

输入一个整数: 198 
输入另一个整数: 876
两个整数的和为 1074

第二套系统, 可以接收一整行输入, 直到遇到回车才停止接收数据. 且 nextLine() 不会将换行符读取进来.

程序示例:

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        System.out.println("Enter some words:");
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        System.out.print(s1);
        System.out.println("结束");
    }
}

执行结果:

Enter some words:
    Hello   world
    Hello   world结束

通过结束二字的输出位置可以看出, nextLine() 不会将换行符读取进来.

程序示例:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个字符串:");
        String line1 = sc.nextLine();
        System.out.println(line1);
        System.out.println("请输入第二个字符串:");
        String line2 = sc.nextLine();
        System.out.println(line2);
    }
}

执行结果:

请输入第一个字符串:
hello     world
hello     world
请输入第二个字符串:
早    上     好
早    上     好

两套系统混着用的一个弊端:

import java.util.Scanner;

public class test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int num1 = sc.nextInt();
        System.out.println(num1);
        System.out.println("请输入一个字符串:");
        String line1 = sc.nextLine();
        System.out.println(line1);
        System.out.println("结束");
    }
}

执行结果 1:

请输入一个数字:
123
123
请输入一个字符串:

结束

line1 读取到了一个换行符, 但是不会将换行符存储进去, , 所以 line1 是空的, 因此此处的 System.out.println(line1); 相当于 System.out.println("");, 也相当于 System.out.println();. 因此仅仅只打印了一个换行.

执行结果 2:

请输入一个数字:
123     456
123
请输入一个字符串:
     456
结束

程序示例:

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个字符串:");
        String line1 = sc.nextLine();
        System.out.print(line1);  // 是 print 而不是 println
        System.out.println("请输入第二个字符串:");
        String line2 = sc.nextLine();
        System.out.println(line2);
    }
}

执行结果:

请输入第一个字符串:
hello   world
hello   world请输入第二个字符串:
   你    好
   你    好

由此可见, nextLine() 不会把换行符存储在字符串中. nextLine() 可以将换行符从缓冲区中读取走且不放到字符串中, 这样换行符既不在缓冲区, 也不在换行符中, 相当于丢弃了. 但是 Scanner 的第一套用法是把所有输入中除了读取到的东西之外的东西全部放到缓冲区中等待下次读取. 在第一套系统中, 比如输入 123 456, 但是会带着一个回车, 然后只读取了 123, 就剩下 三个空格加数字 456 再加一个回车在内存中. 如果输入的是 123, 那么读取走 123 放到对应的变量中, 剩余一个换行符留在缓冲区中. 第二套系统不会把换行符读进变量, 不会把换行符保存在变量中, 也不会把换行符留在缓冲区等待下一次读取.

posted @ 2024-08-30 23:08  有空  阅读(101)  评论(0)    收藏  举报