Lendo pequenos arquivos em Java

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.




