输入输出
1. 控制台输出(3种核心方式)
System.out.println(内容)// 输出后自动换行System.out.print(内容)// 输出后不换行System.out.printf(格式,参数)// 格式化输出(和 C语言 printf 用法一致)示例:
System.out.println("Hello, Java");System.out.print("请输入: ");System.out.printf("年龄: %d, 体重: %.1fkg",18,62.5);输出结果:
格式化输出常用的占位符:
| 占位符 | 类型 / 作用 | 示例 | 输出 |
|---|---|---|---|
| %d | 十进制整数 | (“数字:%d”, 100); | 数字:100 |
| %x | 十六进制整数(小写) | (“小写十六进制:%x”, 255); | 小写十六进制:ff |
| %X | 十六进制整数(大写) | (“大写十六进制:%X”, 255); | 大写十六进制:FF |
| %f | 浮点数(默认6位小数) | (“价格:%.2f”, 9.9); | 价格:9.90 |
| %s | 字符串 | (“姓名:%s”, “张三”); | 姓名:张三 |
| %c | 单个字符 | (“单个字符:%c”, ‘A’) | 单个字符:A |
| %% | 输出百分号占位符 | (“当前进度:75%%”); | 当前进度:75% |
| %b | 布尔值(小写) | (“布尔结果:%b”, 10 > 5); | 布尔结果:true |
| %B | 布尔值(大写) | (“大写布尔:%B”, 1 == 2); | 大写布尔:FALSE |
| %e | 科学计数法 | (“科学计数法:%e”, 1234567.89); | 科学计数法:1.234568e+06 |
2. 控制台输入(核心用Scanner类)
Java 控制台输入必须先导入java.util.Scanner工具类,通过它读取用户输入的不同类型数据,以下是语法:
importjava.util.Scanner;// 导入Scanner类// 创建Scanner对象, 绑定标准输入流(键盘)// Scanner 对象名 = new Scanner(System.in);Scannerscan=newScanner(System.in);// 具体所需的输入内容// 数据类型 变量名 = 对象名.输出类型();intage=scan.nextInt();// 关闭输入调用, 释放系统输入资源// 对象名.close();scan.close();2.1 基础类型匹配
以下是常用用法:Scanner为每种基础数据类型提供了专属的读取方法,输入内容必须符合对应类型的格式规范,否则会抛出InputMismatchException异常:
| 目标数据类型 | 对应读取方法 |
|---|---|
| int | nextInt() |
| double | nextDouble() |
| boolean | nextBoolean() |
| String 字符串 | next() |
| String 整行文本 | nextLine() |
2.2 常用用法
- 单组输入
importjava.util.Scanner;// 导入Scanner类publicstaticvoidmain(String[]args){// 创建Scanner对象, 绑定标准输入流(键盘)Scannerscan=newScanner(System.in);System.out.print("请输入姓名: ");Stringname=scan.nextLine();// 读取一整行字符串(包含空格)System.out.print("请输入年龄: ");intage=scan.nextInt();// 读取整数System.out.print("请输入工资/月: ");doublesalary=scan.nextDouble();// 读取浮点数// 输出结果System.out.printf("姓名: %s, 年龄: %d, 工资: %.1f%n",name,age,salary);scan.close();// 必须调用, 释放资源}输出结果:
- 多组输入
如果需要批量读取数据,用hasNextXxx()(has对应读取类型)方法判断是否还有输入:
采用while循环语句进行不断循环
// 计算输入整数的和importjava.util.Scanner;publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intsum=0;intcount=0;// 循环读取整数, 直到用户输入非整数或结束while(scanner.hasNextInt()){intnum=scanner.nextInt();sum+=num;count++;}System.out.printf("共输入%d个数, 总和: %d%n",count,sum);scanner.close();}输出结果:
注意: 连续输入 使用Ctrl + z或者Ctrl + d强制结束输入,或者输入非 hasNextXxx()(非 has对应读取类型)结束输入
2.3 常见的匹配错误
nextInt()、nextDouble()这类数值读取方法,只会读取数值本身,不会把输入完数值后按下的回车换行符自动去掉
如果接着调用nextLine(),它会直接读取换行符为输入内容,最终得到空字符串,跳过预期的字符串输入步骤
错误示例:
importjava.util.Scanner;publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.print("请输入您的年龄: ");intage=scanner.nextInt();System.out.print("请输入您的姓名: ");Stringname=scanner.nextLine();// 这里直接读到换行符, name变成空字符串scanner.close();}输出结果:
解决方法:再调用一次scanner.nextLine();即可
importjava.util.Scanner;publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.print("请输入您的年龄: ");intage=scanner.nextInt();// 读取回车scanner.nextLine();// 清空缓冲区的换行符System.out.print("请输入您的姓名: ");Stringname=scanner.nextLine();// 现在可以正常读取带空格的 name 了scanner.close();}输出结果:
2.4 其他注意事项
- 所有
nextXxx()数值方法都会自动忽略输入前的空格、制表符,只读取有效数值部分 Scanner使用完毕后记得调用对象名.close()关闭,释放系统输入资源,养成良好的编码习惯