Olá…Tenho uma aplicação cliente-servidor que tem como um dos objetivos facultar o tráfego de arquivos de vídeo de uma ponta à outra (acho que muitos de vocês já devem ter visto esse cabeçalho nas minhas questões aqui no guj, hehe)…Tenho uma thread no meu cliente que recebe os dados do vídeo e grava em um arquivo temporário. O protótipo de teste dela é o seguinte:
public void run()
{
try
{
Mensagem<String> requisicao = new Mensagem(TipoDeMensagem.REQUISICAO_ENVIO_DE_ARQUIVO_DE_VIDEO,nomeDoArquivo);
saidaObjeto.writeObject( requisicao );
saidaObjeto.flush();
arquivo = controlador.getArquivoDeVideoTemporario(nomeDoArquivo);
Mensagem<Integer> mensagem = (Mensagem<Integer>)entradaObjeto.readObject();
if(mensagem.getTipoDeMensagem()==TipoDeMensagem.TRANSPORTE_DE_INFORMACAO_DE_TAMANHO_DE_ARQUIVO)
{
DataOutputStream saidaArquivo = new DataOutputStream(new FileOutputStream(arquivo));
//O servidor envia o tamanho do arquivo que está para enviar, empacotado em um Integer
int bytesParaReceber = ((Integer)mensagem.getDados()).intValue();
this.painelRequisicao.iniciaTransmissaoArquivo(bytesParaReceber);
int tamanhoDoFragmento = 102400;
int bytesLidos;
int totalBytesRecebidos = 0;
//progressoTransmissao.inicia(bytesParaReceber, ThreadProgressoTransmissao.RECEBENDO_ARQUIVO);
Mensagem respostaPadrao = new Mensagem(TipoDeMensagem.RESPOSTA_OK);
while(bytesParaReceber>0)
{
if(this.continuaTransmissao)
{
saidaObjeto.writeObject(respostaPadrao);
saidaObjeto.flush();
}
else
{
saidaObjeto.writeObject(new Mensagem(TipoDeMensagem.RESPOSTA_NAO_OK));
saidaObjeto.flush();
break;
}
bytesLidos = (bytesParaReceber >= tamanhoDoFragmento ? tamanhoDoFragmento : bytesParaReceber);
System.out.println("Falta receber "+bytesParaReceber+" bytes");
Mensagem<byte[]> dados = (Mensagem<byte[]>)entradaObjeto.readObject();
saidaArquivo.write(dados.getDados(),0,bytesLidos);
bytesParaReceber = bytesParaReceber - bytesLidos;
totalBytesRecebidos = totalBytesRecebidos+bytesLidos;
this.painelRequisicao.setValorProgressoTransmissao(totalBytesRecebidos);
dados = null;
}
saidaArquivo.close();
if(continuaTransmissao && bytesParaReceber==0)
{
this.painelRequisicao.exibeVideo(arquivo);
}
else
{
//significa que a transmissao foi abortada, assim o arquivo temporario é removido.
arquivo.delete();
arquivo = null;
}
this.painelRequisicao.finalizaTransmissaoArquivo();
this.continuaTransmissao=false;
this.terminouTransmissao = true;
}
else
{
arquivo.delete();
arquivo = null;
this.continuaTransmissao=false;
this.terminouTransmissao = true;
this.painelRequisicao.exibeErroTransmissao("Problemas no recebimento do arquivo.");
}
}
catch(Exception ex)
{
arquivo.delete();
arquivo = null;
this.continuaTransmissao=false;
this.terminouTransmissao = true;
this.painelRequisicao.exibeErroTransmissao("Problemas no recebimento do arquivo.");
}
}
Quando eu recebo vários vídeos seguidos surge um OutOfMemoryError na instrução
Mensagem<byte[]> dados = (Mensagem<byte[]>)entradaObjeto.readObject();
Queria saber se meu modo de tratar esse problema é o mais correto ou se estou cometendo algum erro. Fora isso, há uma forma de otimizar a utilização da memória em termos de código (fazer um código que utilize melhor a memória)?