Transferência de arquivo muito grande

9 respostas
C

Oi pessoal.

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 origem
                file_in = new FileInputStream(dir_fonte + File.separator +
                        file.getName());
    
                // Criação do arquivo destino
                file_out = new FileOutputStream(dir_destino + File.separator +
                        file.getName());
    
                buffer = new byte[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,

[]'s ClodoaldoJR

9 Respostas

fenrir

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

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á

  1. Tente resolver seu problema mais urgente usando xcopy na linha de comando.

  2. 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ê:

public class StreamUtilities {

	public static void copy(InputStream is, OutputStream os) {
		int ch; 
		byte[] buffer = new byte[1024]; 
		int bytes_read;
		try { 
		    do {
					bytes_read = is.read(buffer);
				  if (bytes_read == -1) { 
				      return; 
				  }
					os.write(buffer, 0, bytes_read);
					os.flush();
		    }while(bytes_read != -1);
		} catch (Exception e) { 
		    e.printStackTrace(); 
		} finally { 
		    
		}
	}
}

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…

Se tiver problemas, me avise.

J

Veja se isso lhe ajuda:

File fileDe = new File("C:\\seila.txt");
File filePara = new File("D:\\seila.txt");

FileChannel arqDe = new RandomAccessFile(fileDe,"r").getChannel();
FileChannel arqPara = new RandomAccessFile(filePara, "rw").getChannel();
arqDe.transferTo(0, arqDe.size(), arqPara);
arqDe.close();
arqPara.close();
C

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

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. :slight_smile:

Criado 21 de novembro de 2006
Ultima resposta 21 de nov. de 2006
Respostas 9
Participantes 6