Caros amigos,
Tenho uma API que faz o download de um arquivo (planilha excel) da WEB lê este arquivo (apache poi) e criar alguns objetos que depois serão persistidos. A API funciona perfeitamente o único inconveniente é que tenho que baixar o arquivo para meu micro e depois manipulá-lo. Preciso que isso seja feito em memória, sem ter que salvar o arquivo no micro, pois vou colocar a API em um programa que vai para a WEB. Como fazer? Quais problemas posso ter em relação e memória, pois agora vou manipular o arquivo em memória.
A lógica que uso é a seguinte:
SERVIÇO:
...
try
{
File arq = CarregarArquivoCotacao (tipo.getNomeArquivo(), 2012);
FileInputStream fileInputStream = new FileInputStream(arq);
... manipulação do fileInputStream usando POI...
arq.delete();
}
catch (Exception e)
{
e.getMessage();
}
...
MÉTODO PARA CARREGAR O ARQUIVO:
...
private File CarregarArquivoCotacao (String nomeArquivo, Integer ano)
{
String complementoURL = "/" + ano.toString() + "/" + "historico" + nomeArquivo + "_" + ano.toString() + ".xls";
String localFileName = "historico" + nomeArquivo + "_" + ano.toString() + ".xls";
String localPath = "/Users/marcelomagalhaes/Desktop/";
return util.Util.doDownload(URL_TESOURO_DIRETO + complementoURL, localPath + localFileName);
}
...
FAZER O DOWNLOAD:
...
public static File doDownload(String stringUrl, String pathLocal)
{
try {
//Encapsula a URL num objeto java.net.URL
URL url = new URL(stringUrl);
//Cria streams de leitura (este metodo ja faz a conexao)...
InputStream is = url.openStream();
//... e de escrita.
FileOutputStream fos = new FileOutputStream(pathLocal);
//Le e grava byte a byte. Voce pode (e deve) usar buffers para
//melhor performance (BufferedReader).
int umByte = 0;
while ((umByte = is.read()) != -1)
{
fos.write(umByte);
}
//Nao se esqueca de sempre fechar as streams apos seu uso!
is.close();
fos.close();
//apos criar o arquivo fisico, retorna referencia para o mesmo
return new File(pathLocal);
}
catch (Exception e)
{
//Lembre-se de tratar bem suas excecoes, ou elas tambem lhe tratarão mal!
//Aqui so vamos mostrar o stack no stderr.
e.printStackTrace();
}
return null;
}
...
Abraços a todos.
May the force be with us.