Skip to main content

Command Palette

Search for a command to run...

Lendo pequenos arquivos em Java

Updated
4 min read
Lendo pequenos arquivos em Java
A
My name is Lucas. I'm a journalist and software developer who can take photos, print zines and make videos, that's no joke. 📸📰🎬💻🕺😅

A classe padrão do Java fornece várias formas para ler arquivos, algumas mais antigas e outras mais novas. Neste artigo vamos considerar dois métodos básicos, utilizando a classe Scanner ou ler todo o arquivo para uma String utilizando as classes Paths e Files.

Lendo dados com o Scanner

Muito utilizada para ler dados informados pelo usuário no terminal, também é possível usar a classe java.util.Scanner para ler dados de arquivos. Ela oferece uma abordagem de alto nível para leitura de dados de entrada, permitindo a leitura de tipos primitivos ou strings por meio de expressões regulares.

Primeiramente, precisamos criar uma instância de java.io.File e, em seguida, uma instância de Scanner, passando o objeto de arquivo. Depois disso, podemos obter dados do arquivo usando o Scanner da mesma forma que lemos da entrada padrão.

Suponha que você tenha uma string chamada pathToFile. Ela armazena o caminho para um arquivo que contém uma sequência de números separados por espaços.

Vamos criar um objeto de arquivo e, em seguida, um scanner para ler os dados do arquivo:

File file = new File(pathToFile);
Scanner scanner = new Scanner(file); // it throws FileNotFoundException (checked)

Ao criar uma instância Scannerpassando um arquivo, você deve tratar a exceção verificada FileNotFoundException. Você também pode declarar o método para lançar essa exceção.

Agora, podemos usar métodos de Scanner para ler dados como strings, números inteiros e assim por diante.

Vamos ler uma linha do arquivo.

while (scanner.hasNext()) {
    System.out.print(scanner.nextLine());
}

Este código lê cada linha do arquivo e a envia para a saída padrão.

Após usar um scanner, devemos fechar o objeto para evitar vazamentos de memória. Uma maneira conveniente de fechar scanners e lidar com exceções é usar a instrução try-with-resources, como abaixo:

File file = new File(pathToFile);

try (Scanner scanner = new Scanner(file)) {
    while (scanner.hasNext()) {
        System.out.print(scanner.nextLine() + " ");
    }
} catch (FileNotFoundException e) {
    System.out.println("No file found: " + pathToFile);
}

Em seguida, para um arquivo contendo:

first line
second line
third line

O programa exibe o seguinte resultado no console:

first line second line third line

O scanner também permite ler inteiros, booleanos, números de ponto flutuante de dupla precisão e outros tipos. Os métodos correspondentes têm nomes como nextInt, nextBoolean e etc. Caso não haja novos dados disponíveis, os métodos next lançam uma exceção java.util.NoSuchElementException.

Em vez de exibir os dados lidos na saída padrão, você pode armazená-los em uma matriz ou em uma String.

Ler todo o texto de um arquivo como uma única String

Neste tópico, vamos nos limitar a aprender como ler um arquivo de texto inteiro. Observe que este método deve ser usado apenas para arquivos de texto pequenos. Por pequenos, queremos dizer que seu tamanho é menor que a RAM disponível para a JVM. Isso é mais do que suficiente para aprendizado e execução de pequenas tarefas.

Primeiramente, realize as seguintes importações:

import java.nio.file.Files;
import java.nio.file.Paths;

A classe Files consiste em métodos que operam em arquivos; a classe Paths contém um conjunto de métodos que retornam um objeto especial para representar o caminho para um arquivo.

O método a seguir retorna todo o texto de um arquivo especificado:

public static String readFileAsString(String fileName) throws IOException {
    return new String(Files.readAllBytes(Paths.get(fileName)));
}

Vamos tentar usar o método readFileAsString para ler o código-fonte do arquivo HelloWorld.java e imprimi-lo na saída padrão.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ReadingFileDemo {
    public static String readFileAsString(String fileName) throws IOException {
        return new String(Files.readAllBytes(Paths.get(fileName)));
    }

    public static void main(String[] args) {
        String pathToHelloWorldJava = "/home/username/Projects/hello-world/HelloWorld.java";
        try {
            System.out.println(readFileAsString(pathToHelloWorldJava));
        } catch (IOException e) {
            System.out.println("Cannot read file: " + e.getMessage());
        }
    }
}

Ele imprime o código-fonte:

package org.hyperskill;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Note que não é difícil modificar o código acima para que ele leia o caminho do arquivo de destino da entrada padrão em vez de codificá-lo diretamente no código.

Resumo

Usar os métodos de java.util.Scanner é conveniente para ler diversos tipos de dados de um arquivo. Ao usar Scanner, é necessário tratar a exceção FileNotFoundException ou declará-la. Recomenda-se fechar o Scanner após o uso com try-with-resources. O método que utiliza as classes Files e Paths permite ler todo o texto de um arquivo como uma única String. Ler todo o texto de um arquivo como uma única String é adequado para arquivos pequenos. Esses métodos fornecem ferramentas convenientes para trabalhar com arquivos em Java.