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!