Estou com um probleminha num código que eu fiz onde basicamente ele transfere arquivo de um diretorio para outro. Para arquivos com até 150 mb ele funciona muito bem, mas quando o tamanho é bem grande (230 Mb por exemplo) ocorre uma OutOfMemoryException, ou seja o buffer estoura. Segue meu código:
// Abertura do arquivo origemfile_in=newFileInputStream(dir_fonte+File.separator+file.getName());// Criação do arquivo destinofile_out=newFileOutputStream(dir_destino+File.separator+file.getName());buffer=newbyte[file_in.available()];file_in.read(buffer);file_out.write(buffer);
No meu caso eu teria que ler uma parte do arquivo e gravar. Depois limpo o buffer e leio mais uma parte e assim por diante. Alguém sabe de alguma classe que não seja FileInputStream/FileOutputStream que eu possa fazer isso?
Desde já agradeço pela atenção de todos,
Você já tentou diminuir o tamanho do buffer??
Isso pode deixar o processo mais lento, mas poderia evitar os erros.
Luca
Olá
Independente de qualquer problema porque não usa java.nio?
[]s
Luca
tengan
A nova mundo Java tem um artigo falando sobre o pacote java.nio que está presente desde da J2SE 1.4, eles conseguiram transferir um arquivo de 17 MB é pouco em comparado o que vc está fazendo, porém eles utilizaram a classe FileChannel parece que aqui não precisa de Buffer ele faz tudo sozinho transfere de um lado para o outro, ainda não mexi com esse pacote, estou sem tempo, mas dá uma pesquisada em java.nio e na classe FileChannel
C
ClodoaldoJR
Tentei aqui usando a api java.nio mas o problema ainda persiste, ele com certeza deve usar um buffer internamente quando transfere um arquivo de um lugar para o outro. Olha como ficou meu código:
FileChannel in = new FileInputStream(dir_fonte + File.separator +
file.getName()).getChannel();
FileChannel out = new FileOutputStream(dir_destino + File.separator +
file.getName()).getChannel();
in.transferTo(0, in.size(), out);
[]'s
Luca
Olá
Tente resolver seu problema mais urgente usando xcopy na linha de comando.
Investigue com calma pois há muitas possibilidades de erro. Fiz o que você com certeza já fez: googlei sobre isto e não encontrei ainda uma resposta do problema. Mas encontrei muita coisa que me ajudaria se eu estivesse ganhando para isto.
[]s
Luca
jcatino
Esta aqui não costumo usar, mas deve servir para você:
Coloque tamanhos maiores para o buffer, como 5K. E, atenção, abra e feche os streams, ou coloque os fechamentos no finally se tiver preguiça de fazer uma casca, hehe…
Tanto usando java.nio quanto o exemplo de jcatino funciona, falei anteriormente que usando jaja.nio não funcionava mas eu tava fazendo errado aqui. Agora usando o código de jcatino vi que era um pouco mais rápido a transferência do arquivo. Agradeço pela ajuda de todos.
[]'s ClodoaldoJR
jcatino
ClodoaldoJR:
Oi pessoal
Tanto usando java.nio quanto o exemplo de jcatino funciona, falei anteriormente que usando jaja.nio não funcionava mas eu tava fazendo errado aqui. Agora usando o código de jcatino vi que era um pouco mais rápido a transferência do arquivo. Agradeço pela ajuda de todos.
[]'s ClodoaldoJR
O nio é tem melhor performance para o cliente final, tinha me estranhado que não funcionasse.