8.8 Praticando o que aprendemos com java.nio.file.Files

1. Classe java.nio.file.Files Objetivo: Manipular arquivos/diretórios usando Path (Java 7+) e integrar com Streams (Java 8). Método Files.list(Path): Retorna um Stream com os elementos do diretório. Exemplo básico de listagem: Files.list(Paths.get("./caminho/do/diretório")) .forEach(System.out::println); 2. Filtrando Arquivos Uso de filter para selecionar arquivos .java: Files.list(Paths.get("./caminho/do/diretório")) .filter(p -> p.toString().endsWith(".java")) .forEach(System.out::println); 3. Leitura de Linhas de Arquivos Problema ao usar Files.lines dentro de map: Files.lines(Path) lança IOException, que não é tratada em lambdas. Erro de compilação: Lambdas não podem lançar exceções verificadas diretamente. Solução: Criar um método auxiliar para encapsular a exceção: static Stream lines(Path p) { try { return Files.lines(p); } catch (IOException e) { throw new UncheckedIOException(e); // Converte para exceção não verificada } } 4. Mapeamento e o Problema de Stream> Código com map e resultado indesejado: Files.list(Paths.get("./caminho/do/diretório")) .filter(p -> p.toString().endsWith(".java")) .map(p -> lines(p)) // Retorna Stream .forEach(System.out::println); // Saída: Referências de objetos (ex: ReferencePipeline$Head@312b1dae) Problema: O map transforma cada Path em um Stream, gerando um Stream aninhado. Demonstração do tipo resultante: Stream strings = Files.list(...) .filter(...) .map(p -> lines(p)); Classe de Exemplo import java.nio.file.*; import java.io.*; import java.util.stream.*; public class ExemploFiles { public static void main(String[] args) { // Listar arquivos .java Files.list(Paths.get("./caminho/do/diretório")) .filter(p -> p.toString().endsWith(".java")) .forEach(System.out::println); // Tentativa de ler linhas (gera Stream) Files.list(Paths.get("./caminho/do/diretório")) .filter(p -> p.toString().endsWith(".java")) .map(p -> lines(p)) .forEach(System.out::println); } // Método auxiliar para tratar IOException static Stream lines(Path p) { try { return Files.lines(p); } catch (IOException e) { throw new UncheckedIOException(e); } } } 6. Conclusão do Capítulo Falta resolvida no próximo tópico (8.9: FlatMap): O problema de Stream> será resolvido com flatMap, que "achata" os streams aninhados em um único Stream. Próximos passos: Usar flatMap(p -> lines(p)) para transformar Stream> em Stream. Processar o conteúdo das linhas dos arquivos de forma unificada.

Mar 29, 2025 - 03:40
 0
8.8 Praticando o que aprendemos com java.nio.file.Files

1. Classe java.nio.file.Files
Objetivo: Manipular arquivos/diretórios usando Path (Java 7+) e integrar com Streams (Java 8).

Método Files.list(Path):

  • Retorna um Stream com os elementos do diretório. Exemplo básico de listagem:
Files.list(Paths.get("./caminho/do/diretório"))  
     .forEach(System.out::println);  

2. Filtrando Arquivos
Uso de filter para selecionar arquivos .java:

Files.list(Paths.get("./caminho/do/diretório"))  
     .filter(p -> p.toString().endsWith(".java"))  
     .forEach(System.out::println);  

3. Leitura de Linhas de Arquivos

Problema ao usar Files.lines dentro de map:

  • Files.lines(Path) lança IOException, que não é tratada em lambdas.
  • Erro de compilação: Lambdas não podem lançar exceções verificadas diretamente.

Solução: Criar um método auxiliar para encapsular a exceção:

static Stream lines(Path p) {  
    try {  
        return Files.lines(p);  
    } catch (IOException e) {  
        throw new UncheckedIOException(e); // Converte para exceção não verificada  
    }  
}  

4. Mapeamento e o Problema de Stream>

Código com map e resultado indesejado:

Files.list(Paths.get("./caminho/do/diretório"))  
     .filter(p -> p.toString().endsWith(".java"))  
     .map(p -> lines(p)) // Retorna Stream>  
     .forEach(System.out::println); // Saída: Referências de objetos (ex: ReferencePipeline$Head@312b1dae)  

Problema: O map transforma cada Path em um Stream, gerando um Stream aninhado.

  • Demonstração do tipo resultante:
Stream> strings = Files.list(...)  
                                     .filter(...)  
                                     .map(p -> lines(p));  
  1. Classe de Exemplo
import java.nio.file.*;  
import java.io.*;  
import java.util.stream.*;  

public class ExemploFiles {  
    public static void main(String[] args) {  
        // Listar arquivos .java  
        Files.list(Paths.get("./caminho/do/diretório"))  
             .filter(p -> p.toString().endsWith(".java"))  
             .forEach(System.out::println);  

        // Tentativa de ler linhas (gera Stream>)  
        Files.list(Paths.get("./caminho/do/diretório"))  
             .filter(p -> p.toString().endsWith(".java"))  
             .map(p -> lines(p))  
             .forEach(System.out::println);  
    }  

    // Método auxiliar para tratar IOException  
    static Stream lines(Path p) {  
        try {  
            return Files.lines(p);  
        } catch (IOException e) {  
            throw new UncheckedIOException(e);  
        }  
    }  
}  

6. Conclusão do Capítulo

  • Falta resolvida no próximo tópico (8.9: FlatMap):
  • O problema de Stream> será resolvido com flatMap, que "achata" os streams aninhados em um único Stream.

Próximos passos:

  • Usar flatMap(p -> lines(p)) para transformar Stream> em Stream.
  • Processar o conteúdo das linhas dos arquivos de forma unificada.