Terminando minha fase de migração de minha aplicação para vraptor3, analisei bem o componente para file upload, que usa o commons-fileupload como backend.
Em minha aplicação antiga, que usava struts 1.3.x eu usava a API de streaming do commons-fileupload. Segundo os desenvolvedores do projeto isso permite uma melhor performance. Não fiz os testes reais, porém faz sentido uma vez que você trabalha com streamings ao invés de I/O em disco.
Notei que o componente para uploading do vraptor usa DiskFileItemFactory. Então para brincar um pouco resolvi fazer uns testes escrevendo um componente para usar o streaming ao invés de disco. Até aqui tudo bem, ficou super simples. Porém me deparei quando ao método FileUpload.file, que me retorna um stream. Quando uso streaming, a cada laço que faço para pegar os arquivos/campos da tela o FileItemIterator.hasNext faz um close dos streams anteriores, sendo assim não consigo armazenar o stream nesse objeto, aliás, consigo armazenar, porém ao ler o mesmo já está finalizado, pois internamente o FileItemIterator faz isso.
Como a abordagem de vocês do vraptor foi de usar InputStream, pergunto porque não byte[]? Há alguma melhora na performance usando stream? Há alguma forma de eu, nesse meu caso, poder contornar a situação e retornar um stream? Pelo menos não conheço na API do I/O para criar um InputStream a partir de outro.
E aproveitando, vocês já usaram streaming no fileupload? Será que realmente haverá algum ganho de performance que possa valer a pena?
Abraços