quinta-feira, 19 de julho de 2018

Reagrupando partes de um arquivo utilizando Java 8 e a nova API de Streams

Desafio: Receber n partes de um arquivo e juntá-las para formar o arquivo original utilizando Java 8.

Imagine que um cliente tem que enviar um arquivo de 1GB para o seu sistema Web. Como é de se esperar, o envio de arquivos desse tamanho é inviável. Uma abordagem válida é quebrar o arquivo original em pedaçoes menores e enviá-los, sendo que o servidor terá que juntar todos os pedaços para formar o arquivo original.

Existem várias formas de se fazer isso, mas resolvi experimentar o uso da nova API de Streams.


1:  public static void main(String[] args) throws IOException {  
2:    
3:            final Path arquivoDestino = Paths.get("/home/usuario/arquivos/arquivogigante.txt");  
4:            Files.createFile(arquivoDestino);  
5:    
6:            final Path diretorio = Paths.get("/home/usuario/arquivos");  
7:            Stream<Path> paths = Files.walk(diretorio).filter(p -> p != diretorio && !p.endsWith("arquivogigante.txt"))  
8:                      .sorted();  
9:    
10:            paths.forEach(p -> {  
11:                 try {  
13:                      Files.copy(p, Files.newOutputStream(arquivoDestino, StandardOpenOption.APPEND));  
14:                 } catch (Exception e) {  
15:                      e.printStackTrace();  
16:                 }  
17:            });  
18:    
19:       }  

Fiz um teste com 100 pedaços de 10MB cada, gerando ao final um arquivo de aproximadamente 1GB. A operação foi feita em poucos milisegundos!

Dá pra melhorar e incrementar muita coisa nesse código, como por exemplo a utilização de checksum para conferir se o arquivo recebido é o mesmo que o cliente enviou. A intenção aqui é deixar uma opção para quando alguém se deparar com uma situação semelhante a essa.

Valeu,
Abraço!

Nenhum comentário:

Postar um comentário