Um guia para a classe Java FileReader

Um guia para a classe Java FileReader

1. Visão geral

Como o nome sugere,FileReader é umJava class that makes it easy to read the contents of a file.

Neste tutorial, aprenderemos o conceito básico deReader e como podemos usar a classeFileReader para fazer operações de leitura em um fluxo de caracteres em Java.

2. Reader Basics

Se olharmos o código da classeFileReader, notaremos que a classe contém código mínimo para criar um objetoFileReader e nenhum outro método.

Isso levanta questões como "Quem faz o trabalho pesado por trás desta aula?"

Para responder a essa pergunta, devemos entender o conceito e a hierarquia da classeReader em Java.

Reader is an abstract base class that makes reading characters possible through one of its concrete implementations. Ele define as seguintes operações básicas de leitura de caracteres de qualquer meio, como memória ou sistema de arquivos:

  • Leia um único caractere

  • Leia uma matriz de caracteres

  • Marcar e redefinir uma determinada posição em um fluxo de caracteres

  • Ignorar posição ao ler um fluxo de caracteres

  • Feche o fluxo de entrada

Naturalmente, todas as implementações da classeReader devem implementar todos os métodos abstratos, a saberread()eclose(). Além disso, a maioria das implementações também substitui outros métodos herdados para fornecer funcionalidade adicional ou melhor desempenho.

2.1. Quando usar umFileReader

Agora que temos algum entendimento sobre aReader, estamos prontos para trazer nosso foco de volta para a classeFileReader.

FileReader herda sua funcionalidade deInputStreamReader, que é uma implementaçãoReader projetada para ler bytes de um fluxo de entrada como caracteres.

Vamos ver essa hierarquia nas definições de classe:

public class InputStreamReader extends Reader {}

public class FileReader extends InputStreamReader {}

Em geral, podemos usar umInputStreamReader para ler caracteres de qualquer fonte de entrada.

No entanto, quando se trata de ler o texto de um arquivo, usar umInputStreamReader seria como cortar uma maçã com uma espada. Claro, a ferramenta certa seria uma faca, que é exatamente o queFileReader promete.

Podemosuse a FileReader when we want to read text from a file using the system’s default character set. Para qualquer outra funcionalidade avançada, seria ideal para usar a classeInputStreamReader diretamente.

3. Lendo um arquivo de texto com umFileReader

Vamos percorrer um exercício de codificação de leitura de caracteres de um arquivoHelloWorld.txt usando uma instânciaFileReader.

3.1. Criando umFileReader

Como classe de conveniência,FileReader offers three overloaded constructors que pode ser usado para inicializar um leitor que pode ler de um arquivo como fonte de entrada.

Vamos dar uma olhada nestes construtores:

public FileReader(String fileName) throws FileNotFoundException {
    super(new FileInputStream(fileName));
}

public FileReader(File file) throws FileNotFoundException {
    super(new FileInputStream(file));
}

public FileReader(FileDescriptor fd) {
    super(new FileInputStream(fd));
}

No nosso caso, sabemos o nome do arquivo de entrada. Conseqüentemente, podemos usar o primeiro construtor para inicializar um leitor:

FileReader fileReader = new FileReader(path);

3.2. Lendo um único caractere

A seguir, vamos criarreadAllCharactersOneByOne(), um método para ler os caracteres do arquivo um por vez:

public static String readAllCharactersOneByOne(Reader reader) throws IOException {
    StringBuilder content = new StringBuilder();
    int nextChar;
    while ((nextChar = reader.read()) != -1) {
        content.append((char) nextChar);
    }
    return String.valueOf(content);
}

Como podemos ver no código acima, temosused theread() method in a loop to read characters one by one until it returns -1, o que significa que não há mais caracteres para ler.

Agora, vamos testar nosso código, validando se o texto lido do arquivo corresponde ao texto esperado:

@Test
public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException {
    String expectedText = "Hello, World!";
    File file = new File(FILE_PATH);
    try (FileReader fileReader = new FileReader(file)) {
        String content = FileReaderExample.readAllCharactersOneByOne(fileReader);
        Assert.assertEquals(expectedText, content);
    }
}

3.3. Leitura de uma matriz de caracteres

Podemos até ler vários caracteres de uma vez usando o métodoread(char cbuf[], int off, int len) herdado:

public static String readMultipleCharacters(Reader reader, int length) throws IOException {
    char[] buffer = new char[length];
    int charactersRead = reader.read(buffer, 0, length);
    if (charactersRead != -1) {
        return new String(buffer, 0, charactersRead);
    } else {
        return "";
    }
}

Há uma diferença sutil no valor de retorno deread() quando se trata de ler vários caracteres em uma matriz. Oreturn value here is either the number of characters read or -1 se o leitor atingiu o final do fluxo de entrada.

A seguir, vamos testar a exatidão do nosso código:

@Test
public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException {
    String expectedText = "Hello";
    File file = new File(FILE_PATH);
    try (FileReader fileReader = new FileReader(file)) {
        String content = FileReaderExample.readMultipleCharacters(fileReader, 5);
        Assert.assertEquals(expectedText, content);
    }
}

4. Limitações

Vimos que a classeFileReader depende da codificação de caracteres do sistema padrão.

Portanto, para situações,where we need to use custom values para o conjunto de caracteres, tamanho do buffer ou fluxo de entrada, devemosuse InputStreamReader.

Além disso, todos sabemos que os ciclos de E / S são caros e podem introduzir latência em nosso aplicativo. Portanto, é do nosso interesse paraminimize the number of I/O operations by wrapping a BufferedReader around our FileReader object:

BufferedReader in = new BufferedReader(fileReader);

5. Conclusão

Neste tutorial, aprendemos sobre os conceitos básicos de aReadereFileReader simplifica a execução de operações de leitura em arquivos de texto por meio de alguns exemplos.

Como sempre, o código-fonte completo do tutorial está disponível emGitHub.