第9章

Java输入和输出

掌握Scanner输入和System.out输出的使用方法与格式化技巧

学习目标

Java输入输出概述

在Java编程中,输入输出(I/O)是程序与用户交互的重要方式。Java提供了多种输入输出机制,其中最常用的是控制台输入输出。通过Scanner类可以方便地读取用户输入,通过System.out可以向控制台输出信息。

Scanner输入

基本语法:
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
scanner.close();
  • 读取各种数据类型
  • 支持输入验证
  • 处理用户交互
  • 灵活的输入方式

System.out输出

基本语法:
System.out.print("不换行输出");
System.out.println("换行输出");
System.out.printf("格式化: %s %d\n", name, age);
  • 基本文本输出
  • 格式化输出
  • 控制输出格式
  • 美化显示效果

Scanner类详解

Scanner类是Java中用于读取用户输入的重要工具类,位于java.util包中。它提供了多种方法来读取不同类型的数据,是控制台程序开发的基础。

Scanner基本使用

创建和使用Scanner:
import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        // 创建Scanner对象
        Scanner scanner = new Scanner(System.in);
        
        // 读取用户输入
        System.out.print("请输入您的姓名: ");
        String name = scanner.nextLine();
        
        System.out.print("请输入您的年龄: ");
        int age = scanner.nextInt();
        
        // 输出结果
        System.out.println("您好 " + name + ",您今年 " + age + " 岁");
        
        // 关闭Scanner
        scanner.close();
    }
}

Scanner方法详解

方法 说明 示例
next() 读取单个单词(到空格为止) String word = scanner.next();
nextLine() 读取整行(到换行符为止) String line = scanner.nextLine();
nextInt() 读取整数 int num = scanner.nextInt();
nextDouble() 读取浮点数 double d = scanner.nextDouble();
nextBoolean() 读取布尔值 boolean b = scanner.nextBoolean();
hasNext() 检查是否有下一个输入 while(scanner.hasNext())
hasNextInt() 检查下一个是否为整数 if(scanner.hasNextInt())
注意事项:
  • 使用nextInt()等方法后,如果要使用nextLine(),需要先调用一次nextLine()清除缓冲区
  • Scanner使用完毕后应该调用close()方法释放资源
  • 建议使用try-catch处理输入异常

System.out输出详解

System.out是Java中标准输出流,提供了多种输出方法。掌握这些方法可以让程序输出更加美观和专业。

基本输出方法

基本输出示例:
// print() - 不换行输出
System.out.print("Hello ");
System.out.print("World!");
// 输出: Hello World!

// println() - 换行输出
System.out.println("第一行");
System.out.println("第二行");
// 输出:
// 第一行
// 第二行

// 输出不同数据类型
System.out.println("字符串: " + "Hello");
System.out.println("整数: " + 42);
System.out.println("浮点数: " + 3.14);
System.out.println("布尔值: " + true);

printf格式化输出

printf方法提供了强大的格式化功能,可以精确控制输出格式。

printf格式化示例:
String name = "张三";
int age = 25;
double salary = 8500.5;

// 基本格式化
System.out.printf("姓名: %s, 年龄: %d, 薪资: %.2f\n", name, age, salary);
// 输出: 姓名: 张三, 年龄: 25, 薪资: 8500.50

// 字符串格式化
System.out.printf("左对齐: %-10s|\n", name);
System.out.printf("右对齐: %10s|\n", name);
// 输出:
// 左对齐: 张三        |
// 右对齐:         张三|

// 数字格式化
System.out.printf("整数: %d\n", age);
System.out.printf("带符号: %+d\n", age);
System.out.printf("补零: %05d\n", age);
// 输出:
// 整数: 25
// 带符号: +25
// 补零: 00025

格式化符号详解

格式符 说明 示例
%s 字符串 printf("%s", "Hello")
%d 整数 printf("%d", 42)
%f 浮点数 printf("%.2f", 3.14)
%c 字符 printf("%c", 'A')
%b 布尔值 printf("%b", true)
%x 十六进制 printf("%x", 255)
%o 八进制 printf("%o", 64)
%e 科学计数法 printf("%e", 1234.5)

实际应用示例

交互式计算器

简单计算器程序:
import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("=== 简单计算器 ===");
        
        try {
            System.out.print("请输入第一个数字: ");
            double num1 = scanner.nextDouble();
            
            System.out.print("请输入运算符 (+, -, *, /): ");
            String operator = scanner.next();
            
            System.out.print("请输入第二个数字: ");
            double num2 = scanner.nextDouble();
            
            double result = 0;
            boolean validOperation = true;
            
            switch (operator) {
                case "+":
                    result = num1 + num2;
                    break;
                case "-":
                    result = num1 - num2;
                    break;
                case "*":
                    result = num1 * num2;
                    break;
                case "/":
                    if (num2 != 0) {
                        result = num1 / num2;
                    } else {
                        System.out.println("错误:除数不能为零!");
                        validOperation = false;
                    }
                    break;
                default:
                    System.out.println("错误:无效的运算符!");
                    validOperation = false;
            }
            
            if (validOperation) {
                System.out.printf("结果: %.2f %s %.2f = %.2f\n", 
                    num1, operator, num2, result);
            }
            
        } catch (Exception e) {
            System.out.println("输入错误,请输入有效的数字!");
        } finally {
            scanner.close();
        }
    }
}
💻 查看完整代码 - 在线IDE体验

常见问题和注意事项

输入缓冲区问题

问题:使用nextInt()后再使用nextLine()读不到内容
问题代码:
Scanner scanner = new Scanner(System.in);
System.out.print("输入年龄: ");
int age = scanner.nextInt();  // 只读取数字,不消费换行符
System.out.print("输入姓名: ");
String name = scanner.nextLine();  // 读取到空字符串
解决方案:
Scanner scanner = new Scanner(System.in);
System.out.print("输入年龄: ");
int age = scanner.nextInt();
scanner.nextLine();  // 清除缓冲区中的换行符
System.out.print("输入姓名: ");
String name = scanner.nextLine();  // 正常读取

输入验证

输入验证示例:
Scanner scanner = new Scanner(System.in);

// 验证整数输入
int number = 0;
boolean validInput = false;

while (!validInput) {
    System.out.print("请输入一个整数: ");
    if (scanner.hasNextInt()) {
        number = scanner.nextInt();
        validInput = true;
    } else {
        System.out.println("输入无效,请输入一个整数!");
        scanner.next(); // 清除无效输入
    }
}

System.out.println("您输入的整数是: " + number);

最佳实践总结

输入输出最佳实践

推荐做法

  • 及时关闭Scanner资源
  • 使用try-catch处理输入异常
  • 验证用户输入的有效性
  • 使用printf进行格式化输出
  • 清除输入缓冲区
  • 提供清晰的输入提示

应该避免

  • 忘记关闭Scanner
  • 不处理输入异常
  • 混用next()和nextLine()不清缓冲区
  • 不验证用户输入
  • 输出格式混乱
  • 缺少用户友好的提示

本章小结