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);
Enter fullscreen mode Exit fullscreen mode
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);
Enter fullscreen mode Exit fullscreen mode
Exemplo: ListarArquivos.java
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.
Exemplo de código usando map:
try {
Files.list(Paths.get("C:/arq_estudo_java"))
.map(Files::lines) // ERRO: IOException não tratada
.forEach(System.out::println);
} catch (IOException e) {
System.err.println("Erro ao listar arquivos: " + e.getMessage());
}
Solução: Criar um método auxiliar para encapsular a exceção:
static Stream<String> lines(Path p) {
try {
return Files.lines(p);
} catch (IOException e) {
throw new UncheckedIOException(e); // Converte para exceção não verificada
}
}
Enter fullscreen mode Exit fullscreen mode
Exemplo: ArquivosStream.java
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<Stream<String>>
.forEach(System.out::println); // Saída: Referências de objetos (ex: ReferencePipeline$Head@312b1dae)
Enter fullscreen mode Exit fullscreen mode
Problema: O map transforma cada Path em um Stream, gerando um Stream aninhado.
- Demonstração do tipo resultante:
Stream<Stream<String>> strings = Files.list(...)
.filter(...)
.map(p -> lines(p));
Enter fullscreen mode Exit fullscreen mode
- 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<Stream<String>>)
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<String> lines(Path p) {
try {
return Files.lines(p);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
Enter fullscreen mode Exit fullscreen mode
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.
原文链接:8.8 Praticando o que aprendemos com java.nio.file.Files
暂无评论内容