【Java】 Java 中的 System.in.read() 详解


我听见有人猜
你是敌人潜伏的内线
和你相知多年
我确信对你的了解
你舍命救我画面
一一在眼前浮现
司空见惯了鲜血
你忘记你本是娇娆的红颜
感觉你我彼此都那么依恋
                      许嵩《内线》


在 Java 编程中,System.in.read() 是用于从控制台读取输入的一个基本方法。它可以读取用户输入的字节数据并返回,通常在编写交互式命令行程序时使用。虽然相对于更高级的输入处理方式(如 Scanner 或 BufferedReader),System.in.read() 显得较为低级,但它是理解 Java 输入输出(I/O)流的重要基础。

在本文中,我们将深入探讨 System.in.read() 的工作原理、使用方法、适用场景以及它的局限性,并介绍一些更高级的输入处理方式。

1. 什么是 System.in.read()?

System.in.read() 是 Java 中用于从标准输入(通常是键盘)读取单个字节的方法。System.in 是一个标准输入流,它被映射到键盘输入,使用字节流 InputStream 类来读取输入。

System.in.read() 有多个重载版本,其中最基础的版本是读取一个字节并返回该字节的 ASCII 值。也可以将输入存储在字节数组中,方便处理更复杂的输入场景。

方法签名:

public abstract int read() throws IOException

该方法返回类型为 int,用于返回从输入流中读取的单个字节的 ASCII 码(0-255),当读取到流的末尾时,会返回 -1 表示输入结束。

2. 基本用法

下面是 System.in.read() 的一个简单示例,展示如何从控制台读取单个字符并将其 ASCII 值打印出来。

示例 1:读取单个字符
import java.io.IOException;

public class ReadExample {
    public static void main(String[] args) {
        try {
            System.out.println("请输入一个字符:");
            int input = System.in.read();  // 读取单个字符
            System.out.println("你输入的字符是:" + (char) input);
            System.out.println("该字符的 ASCII 值是:" + input);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

示例输出:

请输入一个字符:
A
你输入的字符是:A
该字符的 ASCII 值是:65

在这个例子中,用户输入了字符 A,System.in.read() 返回的是字符 A 的 ASCII 码 65。我们通过强制类型转换 (char) input 将返回的 ASCII 码转换回字符,并输出该字符。

3. 读取多个字符

虽然 System.in.read() 可以读取单个字节,但在实际开发中,往往需要读取多个字符或整个输入行。为了简化多个字符的读取,可以使用 read(byte[] b) 方法,它将读取的字节存储在字节数组中。

示例 2:读取多个字符
import java.io.IOException;

public class MultiCharReadExample {
    public static void main(String[] args) {
        try {
            byte[] inputBuffer = new byte[100];  // 创建字节数组
            System.out.println("请输入一些字符:");
            int numBytes = System.in.read(inputBuffer);  // 读取多个字符
            String input = new String(inputBuffer, 0, numBytes - 1);  // 转换为字符串
            System.out.println("你输入的是:" + input);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

示例输出:

请输入一些字符:
Hello, World!
你输入的是:Hello, World!

在这个例子中,System.in.read(inputBuffer) 会读取最多 100 个字节(取决于用户输入),然后我们将这些字节转换为字符串并输出。注意:因为 System.in.read() 会将换行符也包括在内,所以我们使用 numBytes - 1 来去掉换行符。

4. System.in.read() 的工作原理

System.in 是 Java 标准库中的静态输入流,类型为 InputStream,它默认映射到标准输入设备(通常是控制台)。System.in.read() 直接从输入流中读取一个字节的数据,这个字节通常是用户在控制台输入的字符。

每次调用 read() 时,程序会等待用户输入,然后将输入的第一个字节返回。如果用户输入的是多个字符(比如一行字符串),read() 只会处理其中的第一个字符。其他输入会留在缓冲区中,等待后续读取。

输入缓冲区

在大多数操作系统中,标准输入是缓冲的。也就是说,用户输入的数据首先会被存储在缓冲区中,直到遇到换行符(如按下 Enter 键)或者缓冲区满。Java 的 System.in.read() 会一次从缓冲区中读取一个字节,直到数据读取完成。

5. System.in.read() 的局限性

尽管 System.in.read() 是一个直接和简洁的输入方法,但它在实际开发中的局限性使得它不常被用于复杂的输入场景:

5.1 单字节读取

System.in.read() 只能一次读取一个字节的数据,处理较大的输入时显得笨拙和低效。虽然可以通过 read(byte[] b) 读取多个字节,但在实际使用中,处理起来仍然较为麻烦。

5.2 输入处理复杂

每次调用 System.in.read() 时,程序只读取一个字节的 ASCII 码。如果用户输入的是一行文本,开发者需要手动处理多个字节的拼接、转换和解析。这使得处理用户输入变得冗长和不方便。

5.3 缺乏高级功能

System.in.read() 不具备高级输入处理功能,比如按行读取、自动忽略空白符或其他不需要的数据。这种情况下,使用高级的输入处理类(如 Scanner 或 BufferedReader)会更加方便。

6. 使用 Scanner 替代 System.in.read()

对于大多数情况下,Java 开发者会使用更高级的输入处理类,如 Scanner。Scanner 提供了更强大的功能,允许你按行、按词、按整数或浮点数读取数据,简化了输入处理的流程。

使用 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();
    }
}

使用 Scanner 读取整数:

import java.util.Scanner;

public class ReadIntegerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数:");
        int number = scanner.nextInt();  // 读取整数
        System.out.println("你输入的整数是:" + number);
        scanner.close();
    }
}

通过使用 Scanner,我们可以轻松读取各种数据类型,并且无需担心单字节读取、缓冲区处理等复杂细节。

7. 使用 BufferedReader 替代 System.in.read()

除了 Scanner 之外,Java 中的 BufferedReader 也是一个非常强大的输入处理类,它可以从标准输入中读取字符,并且支持按行读取,适合处理较大的文本数据。

使用 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));
        System.out.println("请输入一行文本:");
        try {
            String input = reader.readLine();  // 按行读取输入
            System.out.println("你输入的是:" + input);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BufferedReader 提供了比 System.in.read() 更高效的读取方式,它将输入流缓冲起来,从而可以按行或按字符读取数据。

8. 总结

System.in.read() 是 Java 中最基本的输入方法,它直接从标准输入流中读取字节数据,返回其 ASCII 码值。虽然它的实现非常简洁,但由于只能处理单字节输入,缺乏高级输入功能,在实际开发中较为少用。通常情况下,Java 开发者会选择更加高效和易用的输入工具,如 Scanner 和 BufferedReader,这些工具提供了按行、按词读取等强大功能,极大简化了输入处理的过程。

通过学习 System.in.read(),我们可以更好地理解 Java I/O 的基本原理,但在实际应用中,为了提高效率和代码可读性,推荐

你可能感兴趣的:(Java,java,python,开发语言)