Scanner
Java 用 Scanner 类接受键盘输入. Scanner 在 java.util 包中定义. 当使用的类不是定义在 java.lang 包中时, 需要使用 import 指令导入相应的包.
因为输入对所有人都是可见的, 所以 Scanner 类不适合从控制台读取密码.
步骤:
-
导入该类所在的包 (要使用一个类的话就必须先导入该类所在的包)
-
创建该类的对象
-
调用里面的功能
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
放到对应的变量中, 剩余一个换行符留在缓冲区中. 第二套系统不会把换行符读进变量, 不会把换行符保存在变量中, 也不会把换行符留在缓冲区等待下一次读取.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术