A leitura de arquivos sempre foi uma tarefa corriqueira na programação, desde pequenos experimentos para simulação de bancos de dados até o uso de arquivos para troca de informações entre diferentes sistemas.
Por muito tempo, em Java, houveram alguns padrões dominantes para a leitura de arquivos, como o uso de BufferedReader, Java NIO ou Apache Commons IO, apresentadas nos exemplos de código 1, 2 e 3, respectivamente. Esses padrões são muito verbosos e demandam muitas linhas de código para a realização uma simples tarefa, que é a leitura de um arquivo.
public class BufferedFileReadExample {
public static void main(String[] args) throws IOException {
try {
File f = new File("home/data/data.txt");
BufferedReader b = new BufferedReader(new FileReader(f));
String readLine = "";
while ((readLine = b.readLine()) != null) {
//processa a linha do arquivo
}
b.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class NIOFileReadExample {
public static void main(String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("home/data/data.txt", "r");
FileChannel channel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate((int) channel.size());
channel.read(buffer);
buffer.flip();
for (int i = 0; i < channel.size(); i++) {
//processa a linha do arquivo
}
channel.close();
file.close();
}
}
public class ApacheCommonsIOFileReadExample {
public static void main(String[] args) throws IOException {
try {
File f = new File("home/data/data.txt");
List<String> lines = FileUtils.readLines(f, "UTF-8");
for (String line : lines) {
//processa a linha do arquivo
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
No entando, desde o lançamento do Java 8, existe uma outra maneira muito mais fácil e que vem se tornando o novo padrão para a leitura de arquivos. Esse padrão consiste no uso de Streams para a leitura do arquivo e resulta em um código muito mais simples e elegante como mostra o exemplo de código 4.
public class Java8StreamsFileReadExample {
public static void main(String[] args) {
try (Stream<String> stream = Files.lines(Paths.get("home/data/data.txt"))) {
stream.forEach((String line) -> {
//processa a linha do arquivo
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
Maneiro