在Java编程中,接受键盘输入是一项基础且重要的操作,它能够增强程序的交互性,让用户与程序进行实时数据交换,本文将详细介绍Java中实现键盘输入的多种方式,从传统的Scanner类到更现代的BufferedReader类,再到Java 11引入的Scanner类新特性,帮助开发者根据不同场景选择最合适的输入方法。

使用Scanner类实现键盘输入
Scanner类是Java 5中引入的一个强大的工具类,位于java.util包中,它提供了多种方法来读取不同类型的数据,包括基本数据类型和字符串。Scanner类通过解析输入流中的文本,将原始数据转换为特定的类型,非常适合处理格式化的输入。
基本使用方法
要使用Scanner类读取键盘输入,首先需要创建一个Scanner对象,并将System.in(标准输入流)作为参数传递给它的构造方法。System.in代表的是键盘输入设备,通过它程序可以获取用户在控制台输入的数据,以下是一个简单的示例代码:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的姓名:");
String name = scanner.nextLine();
System.out.println("您好," + name + "!");
scanner.close();
}
}
在上述代码中,scanner.nextLine()方法用于读取用户输入的一整行文本,直到遇到换行符为止,读取完成后,调用scanner.close()方法关闭Scanner对象,以释放系统资源。
读取不同类型的数据
Scanner类提供了多种方法来读取不同类型的数据,例如nextInt()读取整数、nextDouble()读取浮点数、nextBoolean()读取布尔值等,需要注意的是,在使用这些方法时,输入的数据必须与方法期望的类型匹配,否则会抛出InputMismatchException异常。
import java.util.Scanner;
public class DifferentTypesInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int number = scanner.nextInt();
System.out.println("您输入的整数是:" + number);
System.out.print("请输入一个浮点数:");
double decimal = scanner.nextDouble();
System.out.println("您输入的浮点数是:" + decimal);
scanner.close();
}
}
注意事项
在使用Scanner类时,有几个注意事项需要牢记:Scanner类的方法在读取数据时不会跳过空白字符(如空格、制表符、换行符等),因此在读取字符串时,如果使用next()方法,它会读取到下一个空白字符之前的内容,而nextLine()方法则会读取整行,当混使用nextInt()和nextLine()等方法时,可能会因为换行符的残留而导致读取错误,
Scanner scanner = new Scanner(System.in);
System.out.print("请输入年龄:");
int age = scanner.nextInt();
System.out.print("请输入地址:");
String address = scanner.nextLine(); // 这行可能会跳过输入,直接读取nextInt()留下的换行符
为了避免这种情况,可以在nextInt()之后调用一个nextLine()来消耗掉换行符,或者统一使用nextLine()读取整行,然后再将其转换为所需的类型。
使用BufferedReader类实现键盘输入
BufferedReader类是Java I/O中的一个经典类,位于java.io包中,它提供了缓冲字符输入流,能够高效地读取文本数据,与Scanner类相比,BufferedReader类在处理大量数据时性能更优,因为它使用了缓冲区来减少I/O操作的次数。

基本使用方法
BufferedReader类通常与InputStreamReader类一起使用,因为BufferedReader的构造方法需要一个Reader对象作为参数,而InputStreamReader可以将字节流转换为字符流,以下是一个使用BufferedReader读取键盘输入的示例:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.print("请输入一行文本:");
String line = reader.readLine();
System.out.println("您输入的文本是:" + line);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在上述代码中,reader.readLine()方法用于读取用户输入的一行文本,它会阻塞程序执行,直到用户输入换行符为止,由于BufferedReader类可能会抛出IOException异常,因此需要使用try-catch块来处理异常情况。
优势与适用场景
BufferedReader类的主要优势在于其高效性,特别是在读取大量数据时,缓冲机制可以显著提高读取速度。BufferedReader类提供了readLine()方法,能够一次性读取整行数据,避免了Scanner类中混用不同方法时可能出现的换行符问题。BufferedReader类适用于对性能要求较高的场景,或者需要处理大量文本输入的场景。
注意事项
使用BufferedReader类时,需要注意以下几点:BufferedReader类只能读取字符串类型的输入,如果需要读取其他类型的数据(如整数、浮点数),需要手动进行类型转换。BufferedReader类在使用完毕后必须显式关闭,以释放系统资源,通常建议在finally块中关闭BufferedReader对象,确保资源能够被正确释放。
Java 11中Scanner类的新特性
Java 11对Scanner类进行了一些改进,引入了新的方法来简化键盘输入的操作,最显著的新增方法是Scanner类实现了AutoCloseable接口,这意味着Scanner对象可以与try-with-resources语句一起使用,从而自动关闭资源,避免了手动关闭时可能出现的遗漏问题。
使用try-with-resources语句
在Java 11中,可以将Scanner对象声明在try-with-resources语句中,这样在try块执行完毕后,Scanner对象会自动关闭,无需手动调用close()方法。
import java.util.Scanner;
public class ScannerJava11Example {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
System.out.print("请输入您的姓名:");
String name = scanner.nextLine();
System.out.println("您好," + name + "!");
} // Scanner对象会在这里自动关闭
}
}
这种方式不仅简化了代码,还确保了资源的正确释放,是Java 11中推荐的资源管理方式。

其他改进
除了实现AutoCloseable接口外,Java 11还对Scanner类进行了一些其他改进,例如新增了一些方法来提高输入的灵活性和便利性,这些改进使得Scanner类在处理键盘输入时更加高效和易用。
总结与选择建议
在Java中,实现键盘输入有多种方式,每种方式都有其优缺点和适用场景。Scanner类简单易用,提供了多种方法来读取不同类型的数据,适合处理简单的输入需求;BufferedReader类性能更优,适合处理大量数据或对性能要求较高的场景;Java 11中的Scanner类通过实现AutoCloseable接口,进一步简化了资源管理。
在选择键盘输入方式时,可以根据以下建议进行决策:如果只是需要读取简单的用户输入,且对性能要求不高,可以使用Scanner类;如果需要处理大量数据或对性能有较高要求,建议使用BufferedReader类;如果使用的是Java 11或更高版本,推荐使用try-with-resources语句来管理Scanner对象,以确保资源的正确释放。
无论选择哪种方式,都需要注意输入数据的类型匹配、异常处理以及资源释放等问题,以确保程序的稳定性和可靠性,通过合理选择和使用键盘输入方法,可以编写出更加健壮和高效的Java程序。
















