1. 引言

在许多Java应用中,我们需要逐个读取输入数据,因为这是一项常见的任务,特别是在处理来自流源的大量数据时。

在这篇教程中,我们将探讨Java中逐字符读取数据的各种方法。

2. 使用BufferedReader获取控制台输入

我们可以利用BufferedReaderJava BufferedReader)从控制台逐字符读取。请注意,这种方法适用于我们希望进行交互式读取的情况。

下面是一个示例:

@Test
public void givenInputFromConsole_whenUsingBufferedStream_thenReadCharByChar() throws IOException {
    ByteArrayInputStream inputStream = new ByteArrayInputStream("TestInput".getBytes());
    System.setIn(inputStream);

    try (BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in))) {
        char[] result = new char[9];
        int index = 0;
        int c;
        while ((c = buffer.read()) != -1) {
            result[index++] = (char) c;
        }

        assertArrayEquals("TestInput".toCharArray(), result);
    }
}

这里,我们通过创建一个包含“TestInput”内容的ByteArrayInputStream来模拟控制台输入。然后,我们使用BufferedReaderSystem.in读取字符。接着,我们使用read()方法以整数代码形式读取一个字符,并将其转换为char类型。最后,我们使用assertArrayEquals()方法验证读取的字符与预期输入匹配。

3. 使用FileReader读取文件

在处理文件时,FileReaderJava FileReader)是逐字符读取的理想选择:

@Test
public void givenInputFromFile_whenUsingFileReader_thenReadCharByChar() throws IOException {
    File tempFile = File.createTempFile("tempTestFile", ".txt");
    FileWriter fileWriter = new FileWriter(tempFile);
    fileWriter.write("TestFileContent");
    fileWriter.close();

    try (FileReader fileReader = new FileReader(tempFile.getAbsolutePath())) {
        char[] result = new char[15];
        int index = 0;
        int charCode;
        while ((charCode = fileReader.read()) != -1) {
            result[index++] = (char) charCode;
        }

        assertArrayEquals("TestFileContent".toCharArray(), result);
    }
}

在上述代码中,我们首先创建一个临时测试文件“tempTestFile”,用于模拟。然后,我们使用FileReader通过其路径创建到文件的连接,使用tempFile.getAbsolutePath()方法。在try-with-resources块中,我们逐字符读取文件。

4. 使用Scanner处理分词输入

对于更动态的方法,允许分词输入,我们可以使用ScannerJava Scanner):

@Test
public void givenInputFromConsole_whenUsingScanner_thenReadCharByChar() {
    ByteArrayInputStream inputStream = new ByteArrayInputStream("TestInput".getBytes());
    System.setIn(inputStream);

    try (Scanner scanner = new Scanner(System.in)) {
        if (scanner.hasNext()) {
            char[] result = scanner.next().toCharArray();
            assertArrayEquals("TestInput".toCharArray(), result);
        }
    }
}

在上述测试方法中,我们通过创建包含“TestInput”内容的ByteArrayInputStream模拟控制台输入。然后,我们使用hasNext()方法检查是否有下一个标记。之后,我们使用next()方法获取当前的一个作为String

5. 总结

总之,我们在Java中探讨了处理字符数据的不同方法,包括使用BufferedReader进行交互式控制台输入、通过FileReader处理文件基础的字符读取,以及通过Scanner处理分词输入。这些方法为开发者提供了在各种场景下高效处理字符数据的多种途径。

如往常一样,本文的完整代码示例可在GitHub上找到。