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