跳转至

Java 中从标准输入读取数据(Read from Stdin in Java)

简介

在Java编程中,从标准输入(stdin)读取数据是一项常见且基础的操作。标准输入通常是用户通过控制台输入的信息,理解如何有效地读取这些输入对于创建交互式程序、命令行工具以及需要用户输入的各类应用至关重要。本文将详细介绍在Java中从标准输入读取数据的相关知识,包括基础概念、使用方法、常见实践和最佳实践。

目录

  1. 基础概念
  2. 使用方法
    • 使用 java.util.Scanner
    • 使用 java.io.BufferedReader
  3. 常见实践
    • 读取整数
    • 读取字符串
    • 读取多行输入
  4. 最佳实践
    • 异常处理
    • 资源管理
  5. 小结
  6. 参考资料

基础概念

标准输入(stdin)是一个输入流,在Java程序运行时,它允许程序接收来自外部的输入信息。通常情况下,这意味着用户在控制台(命令行)输入的数据可以被程序读取和处理。Java提供了多种方式来与标准输入进行交互,主要涉及到 java.util.Scannerjava.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();
            }
        }
    }
}

读取字符串

前面的示例中已经展示了使用 ScannerBufferedReader 读取字符串的基本方法。ScannernextLine() 方法和 BufferedReaderreadLine() 方法都可以直接读取一行字符串。

读取多行输入

使用 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,而 BufferedReaderreadLine() 方法会抛出 IOException。通过适当的异常处理,可以使程序更加健壮,避免因用户输入不当而导致程序崩溃。

资源管理

在使用完 ScannerBufferedReader 后,务必关闭它们以释放资源。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.Scannerjava.io.BufferedReader 是两种常用的方法。Scanner 提供了简单易用的方式来解析各种类型的输入,而 BufferedReader 则在处理文本输入时更加灵活和高效。在实际应用中,需要根据具体需求选择合适的方法,并注意异常处理和资源管理,以确保程序的稳定性和可靠性。

参考资料