Java 中从标准输入读取数据(Read from Stdin in Java)
简介
在Java编程中,从标准输入(stdin)读取数据是一项常见且基础的操作。标准输入通常是用户通过控制台输入的信息,理解如何有效地读取这些输入对于创建交互式程序、命令行工具以及需要用户输入的各类应用至关重要。本文将详细介绍在Java中从标准输入读取数据的相关知识,包括基础概念、使用方法、常见实践和最佳实践。
目录
- 基础概念
- 使用方法
- 使用
java.util.Scanner
- 使用
java.io.BufferedReader
- 使用
- 常见实践
- 读取整数
- 读取字符串
- 读取多行输入
- 最佳实践
- 异常处理
- 资源管理
- 小结
- 参考资料
基础概念
标准输入(stdin)是一个输入流,在Java程序运行时,它允许程序接收来自外部的输入信息。通常情况下,这意味着用户在控制台(命令行)输入的数据可以被程序读取和处理。Java提供了多种方式来与标准输入进行交互,主要涉及到 java.util.Scanner
和 java.io.BufferedReader
等类。
使用方法
使用 java.util.Scanner
Scanner
类是Java 5引入的,它提供了一种简单易用的方式来解析基本类型和字符串输入。以下是使用 Scanner
从标准输入读取数据的基本示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一些内容:");
String input = scanner.nextLine();
System.out.println("你输入的内容是:" + input);
scanner.close();
}
}
在上述代码中:
1. 首先导入 java.util.Scanner
类。
2. 创建一个 Scanner
对象,传入 System.in
,这表示从标准输入读取数据。
3. 使用 nextLine()
方法读取用户输入的一行数据,并将其存储在 input
变量中。
4. 最后输出读取到的内容,并关闭 Scanner
对象以释放资源。
使用 java.io.BufferedReader
BufferedReader
是Java IO库中的一个类,它用于读取文本数据。与 Scanner
不同,它通常需要与 InputStreamReader
结合使用来处理标准输入。以下是使用 BufferedReader
读取标准输入的示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderExample {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("请输入一些内容:");
String input = reader.readLine();
System.out.println("你输入的内容是:" + input);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在这段代码中:
1. 导入 java.io
包下的相关类。
2. 创建一个 BufferedReader
对象,它接收一个 InputStreamReader
对象,而 InputStreamReader
又将 System.in
作为参数,从而实现从标准输入读取数据。
3. 使用 readLine()
方法读取用户输入的一行数据,并将其存储在 input
变量中。
4. 由于 readLine()
方法可能会抛出 IOException
异常,所以需要在 try-catch
块中进行处理。
5. 最后在 finally
块中关闭 BufferedReader
对象以释放资源。
常见实践
读取整数
使用 Scanner
读取整数:
import java.util.Scanner;
public class ReadIntegerWithScanner {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
System.out.println("你输入的整数是:" + number);
} else {
System.out.println("输入不是一个有效的整数。");
}
scanner.close();
}
}
使用 BufferedReader
读取整数:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReadIntegerWithBufferedReader {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
System.out.println("请输入一个整数:");
String input = reader.readLine();
try {
int number = Integer.parseInt(input);
System.out.println("你输入的整数是:" + number);
} catch (NumberFormatException e) {
System.out.println("输入不是一个有效的整数。");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读取字符串
前面的示例中已经展示了使用 Scanner
和 BufferedReader
读取字符串的基本方法。Scanner
的 nextLine()
方法和 BufferedReader
的 readLine()
方法都可以直接读取一行字符串。
读取多行输入
使用 Scanner
读取多行输入:
import java.util.Scanner;
public class ReadMultipleLinesWithScanner {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入多行内容,以空行结束:");
StringBuilder input = new StringBuilder();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.isEmpty()) {
break;
}
input.append(line).append("\n");
}
System.out.println("你输入的内容是:\n" + input.toString());
scanner.close();
}
}
使用 BufferedReader
读取多行输入:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReadMultipleLinesWithBufferedReader {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入多行内容,以空行结束:");
StringBuilder input = new StringBuilder();
try {
String line;
while ((line = reader.readLine()) != null &&!line.isEmpty()) {
input.append(line).append("\n");
}
System.out.println("你输入的内容是:\n" + input.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
最佳实践
异常处理
无论是使用 Scanner
还是 BufferedReader
,都要注意异常处理。Scanner
的某些方法(如 nextInt()
)在输入不匹配时会抛出 InputMismatchException
,而 BufferedReader
的 readLine()
方法会抛出 IOException
。通过适当的异常处理,可以使程序更加健壮,避免因用户输入不当而导致程序崩溃。
资源管理
在使用完 Scanner
或 BufferedReader
后,务必关闭它们以释放资源。Scanner
提供了 close()
方法,而 BufferedReader
也需要调用 close()
方法。可以使用 try-with-resources
语句(Java 7 及以上版本)来简化资源管理,例如:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TryWithResourcesExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
System.out.println("请输入一些内容:");
String input = reader.readLine();
System.out.println("你输入的内容是:" + input);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在 try-with-resources
语句中,BufferedReader
会在语句结束时自动关闭,无需手动调用 close()
方法,这大大简化了资源管理的代码。
小结
在Java中从标准输入读取数据有多种方式,java.util.Scanner
和 java.io.BufferedReader
是两种常用的方法。Scanner
提供了简单易用的方式来解析各种类型的输入,而 BufferedReader
则在处理文本输入时更加灵活和高效。在实际应用中,需要根据具体需求选择合适的方法,并注意异常处理和资源管理,以确保程序的稳定性和可靠性。